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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А мне надо, чтобы они(отдельные потоки) все запустились, но метод не сделал return пока она все не завершаться.
...
Рейтинг: 0 / 0
25.10.2017, 09:32
    #39541452
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
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
25.10.2017, 09:43
    #39541457
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
Потерял тут немного:
Код: java
1.
2.
3.
new SwingWorker(){
 //...
}.execute();
...
Рейтинг: 0 / 0
25.10.2017, 09:51
    #39541460
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
AndronovMVPetro123AndronovMV,
Элементарно, заведи переменную CountThread.
Каждый поток в конце увеличивает на 1.
Дальше догадался?

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

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


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

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

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

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

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

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

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

Код: 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
31.10.2017, 16:49
    #39545414
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
AndronovMVно оказалось все как всегда намного проще.
Ну, да. Нет ничего проще чем наговнокодить и потом накопипастить.
А операции с одним полем в трех паралелльных потоках это вообще прелестно. Вы там потом synchronized поставите, чтобы потоки случайно вдруг вместе не работали, а строго по очереди?
...
Рейтинг: 0 / 0
31.10.2017, 16:56
    #39545425
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
Кстати, стали забывать про CompletableFuture, в котором куча методов для того чтобы запустить, да, подождать.

https://dotnetcodr.com/2016/11/26/waiting-for-background-tasks-to-finish-using-the-completablefuture-class-in-java/
...
Рейтинг: 0 / 0
31.10.2017, 17:02
    #39545431
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
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
31.10.2017, 17:33
    #39545452
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параллелизм Java
AndronovMV
Код: java
1.
2.
3.
4.
5.
t1.join();
t2.join();
t3.join();

return pole;


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

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

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

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

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

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

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

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

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

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

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

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

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


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