powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Параллелизм Java
25 сообщений из 29, страница 1 из 2
Параллелизм Java
    #39541422
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

Честно говоря не смог более точно сформировать вопрос в теме и попробую его разложить тут.

Чувствую как мое приложение на Swing начинает тормозить. Тормоза не из-за интерфейса и не из-за не правильного использования ресурсов.

Приложение работает с БД Орасле. На определенных этапах необходимо делать множество обращений к БД за данными. Данных не много, а обращений много. Задумался об отдельных, фоновых процессах (Thread).

В общем исход таков:
Есть метод , в котором происходит те самые обращения и загрузка из БД. Метод должен вернуть результат (например boolean).

Сейчас в методе все выполняется поэтапно. Т.е. обратились к одной талбички, загрузили ее, потом к другой, потом к третьей и т.д.
После того как обращения и загрузка всех таблиц завершена, возврат метода .

З.Ы. Просьба не предлагать варианты решения, типа "Сделай один общий SQL" ибо вопрос с подтекстом и тут я привел пример, а в реальности может быть совсем не SQL.

Так вот, думал про то, чтобы каждое обращение и загрузку отдельной таблицы засунуть в отдельный процесс и попробовать запараллелить их, но проблема в том, что при возврате метода все процессы должны быть гарантированно завершены.

Я не знаю как это сделать. Есть у кого нить мысли?
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541426
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVДанных не много, а обращений много. Задумался об отдельных, фоновых процессах (Thread).
Второй вариант - кешировать обращение к базе
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541428
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие еще мысли? SwingWorker - стандартное решение. Если его немного допилить то оно вообще шикартное. Я к нему и глобальный индикатор прогресса приделывал и еще много чего. У нас ERP вообще не блокировался. Оператор вводит данные нон-стоп а все вычисления и тем более запросы - в фоне обновляют разные поля согласно бизнес-логике.
Hо прежде чем прыгать с головой в разработку я бы рекомендовал и теорию подтянуть
https://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html
про Event Dispatch Thread, Event Queue, invokeLater, invokeAndWait.
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541433
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!

Со SwingWorker как то сталкивался, но почему то сформировалось мнение что это для типа отрисовок и прочей шляпы с фасадом.

Может лишнее, но проведу аналогию:

Есть совхоз, поле и 3 пахаря.

В совхоз нужно отчитаться что поле вспахано. Пахари могут работать по очереди (как у меня сейчас), а могут параллельно.

Но, не прокатит, запустить каждого пахаря по отдельности (в отдельный поток) и пойти отчитаться в совхоз о проделанной работе. Нужно чтобы они закончили свою работу и только тогда получить плюшку.
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541436
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,
Элементарно, заведи переменную CountThread.
Каждый поток в конце увеличивает на 1.
Дальше догадался?
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541441
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123AndronovMV,
Элементарно, заведи переменную CountThread.
Каждый поток в конце увеличивает на 1.
Дальше догадался?

Ну хорошо, я посчитаю сколько выполнилось, но это будет уже поздно, т.к. если из текущего потока запускается отдельный (дочерний), то текущий не останавливается. А в моем случае это означает, что из тек. потока (главного) запустятся 3 отдельных и дойдет до return.

А мне надо, чтобы они(отдельные потоки) все запустились, но метод не сделал return пока она все не завершаться.
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541452
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVВ совхоз нужно отчитаться что поле вспахано. Пахари могут работать по очереди (как у меня сейчас), а могут параллельно.

Но, не прокатит, запустить каждого пахаря по отдельности (в отдельный поток) и пойти отчитаться в совхоз о проделанной работе. Нужно чтобы они закончили свою работу и только тогда получить плюшку.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
//Когда-то довно на колхозном собрании
ExecutorService threadPool = Executors.cachedThreadPool();

//Ни свет ни заря
new SwingWorker(){
    List<Поле> doInBackground(){
        List<Callable<Поле>> tasks = пахари.stream()
                                                  .map(пахарь::пахать)
                                                  .collect(toList());
        List<Future<Поле>> futures = threadPool.invokeAll(tasks);
        return futures.stream()
                        .map(Feature::get)
                        .collect(toList());
    }
 
    void done(){
         List<Поле> результат = get();
         колхоз.доложить(результат);
    }
}


boilerplate код добавить по вкусу.
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541457
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потерял тут немного:
Код: java
1.
2.
3.
new SwingWorker(){
 //...
}.execute();
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541460
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVPetro123AndronovMV,
Элементарно, заведи переменную CountThread.
Каждый поток в конце увеличивает на 1.
Дальше догадался?

Ну хорошо, я посчитаю сколько выполнилось, но это будет уже поздно, т.к. если из текущего потока запускается отдельный (дочерний), то текущий не останавливается. А в моем случае это означает, что из тек. потока (главного) запустятся 3 отдельных и дойдет до return.

А мне надо, чтобы они(отдельные потоки) все запустились, но метод не сделал return пока она все не завершаться.
Причём тут return?
Ты видимо не понял идею.
Последний общий метод не запускается, пока его не запустит один из потоков на выходе (последний).
Так понятно с землекопами пахарями?
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541467
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVэто будет уже поздно
А сеттер счётчика зачем? Из него ты в основном потоке и побежишь докладывать)).
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541481
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVЧувствую как мое приложение на Swing начинает тормозить.AndronovMVДанных не много, а обращений многоЭто что-то вроде " 100 запросов для 100 TextField-ов "?AndronovMVПриложение работает с БД ОраслеAndronovMVа в реальности может быть совсем не SQL
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541488
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,
))
Чел просто решил изучить потоки, но вместа примера про тракторы наплёл что то невообразимое.
...
Рейтинг: 0 / 0
Параллелизм Java
    #39541544
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123AndronovMVпропущено...


Ну хорошо, я посчитаю сколько выполнилось, но это будет уже поздно, т.к. если из текущего потока запускается отдельный (дочерний), то текущий не останавливается. А в моем случае это означает, что из тек. потока (главного) запустятся 3 отдельных и дойдет до return.

А мне надо, чтобы они(отдельные потоки) все запустились, но метод не сделал return пока она все не завершаться.
Причём тут return?
Ты видимо не понял идею.
Последний общий метод не запускается, пока его не запустит один из потоков на выходе (последний).
Так понятно с землекопами пахарями?

Так понятно! Спасибо! )

Petro123Usman,
))
Чел просто решил изучить потоки, но вместа примера про тракторы наплёл что то невообразимое.

))) Хотел чтобы вы абстрагировались и не предлагали оптимизировать запрос БД .

Всем спасибо!
...
Рейтинг: 0 / 0
Параллелизм Java
    #39544465
Valery Shiskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

По моему мнению, самое толковое решение у Blazkowicz.
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545406
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем разобрался!
Спасибо конечно за варианты, но оказалось все как всегда намного проще.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Field pole = new Field(100,100); // Создаем поле 100х100 га.

Thread t1 = new Thread(new Runnable(){
   @Override
   public void run() {
   // Запускаем 1-го пахаря
   // тут некоторые операции с полем (pole)
   ...
   }
});
t1.start();

Thread t2 = new Thread(new Runnable(){
   @Override
   public void run() {
   // Запускаем 2-го пахаря
   // тут некоторые операции с полем (pole)
   ...
   }
});
t2.start();

Thread t3 = new Thread(new Runnable(){
   @Override
   public void run() {
   // Запускаем 3-го пахаря
   // тут некоторые операции с полем (pole)
   ...
   }
});
t3.start();

// А теперь присоединяем все потоки в главный и ждем пока они отработают (параллельно)
t1.join();
t2.join();
t3.join();

return pole;
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545414
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVно оказалось все как всегда намного проще.
Ну, да. Нет ничего проще чем наговнокодить и потом накопипастить.
А операции с одним полем в трех паралелльных потоках это вообще прелестно. Вы там потом synchronized поставите, чтобы потоки случайно вдруг вместе не работали, а строго по очереди?
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545425
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, стали забывать про CompletableFuture, в котором куча методов для того чтобы запустить, да, подождать.

https://dotnetcodr.com/2016/11/26/waiting-for-background-tasks-to-finish-using-the-completablefuture-class-in-java/
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545431
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
static import java.util.concurrent.*;

Поле поле = new Поле();
Пахарь пахарь1 = new Пахарь(поле);
Пахарь пахарь2 = new Пахарь(поле);
Пахарь пахарь3 = new Пахарь(поле);

allOf(
       runAsync(пахарь1::пахать),
       runAsync(пахарь2::пахать),
       runAsync(пахарь3::пахать)
).join();
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545452
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV
Код: java
1.
2.
3.
4.
5.
t1.join();
t2.join();
t3.join();

return pole;


Если это ГУИ, то основной поток встанет и заморозит интерфейс?
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545467
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Чет не понял, то что я выше написал - говнокод?

Так то изменения в "поле" каждым пахарям не связаны друг с другом. Другими словами они работаю каждые со своими переменными в контексте поля. Да, и не собирался я синхронизировать их))

Копи-паст это для наглядности в реале у меня по другому. И там честно говоря то над чем я работаю - бекграунд, со свингом связь позже.

За CompletableFuture спасибо!
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545468
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123,

Ну во 1 это не поток ГУИ
Во 2, тут цель была запаралелить пахарей, а не вообще все. )

Спасибо!
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545472
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну кстати ща попробую CompletableFuture
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545474
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVPetro123,

Ну во 1 это не поток ГУИ
Во 2, тут цель была запаралелить пахарей, а не вообще все. )

Спасибо!
))) ok
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545483
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVЧет не понял, то что я выше написал - говнокод?

Ну, да. Управление потоками перемешанно с задачами. Лямды не используются. Копипаста на лицо.

AndronovMVТак то изменения в "поле" каждым пахарям не связаны друг с другом.

Сегодня не связаны, а завтра связаны. Поэтому лучше дать каждому пахарю польностью независимый кусок, а потом собрать куски в одно поле.

AndronovMVКопи-паст это для наглядности в реале у меня по другому.
Ну, какая же тут наглядность. :)
...
Рейтинг: 0 / 0
Параллелизм Java
    #39545485
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эээ, а куда имя класса потрялось?
Код: java
1.
static import java.util.concurrent.CompletableFuture.*;
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / Параллелизм Java
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]