Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Создание потоков из Timer / 25 сообщений из 42, страница 1 из 2
06.09.2018, 14:22
    #39699060
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Добрый день!

Собственно сабж: есть список пользователей (List<Long>) в который при логине вносится ID. В отдельном потоке через определенный интервал времени просматривается этот список и инициируется событие (update row) для каждого ID.

Планирую использовать java.util.Timer и java.util.TimerTask. И через определенный интервал создавать в цикле отдельные потоки для апдейта для каждого ID'шника.

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

Спасибо!
...
Рейтинг: 0 / 0
06.09.2018, 14:46
    #39699082
Cheblin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ip,

nastya перелогинься
...
Рейтинг: 0 / 0
06.09.2018, 14:57
    #39699093
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Сам ты nastya
...
Рейтинг: 0 / 0
06.09.2018, 15:29
    #39699113
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ipСам ты nastya
Ну нельзя же спрашивать про то какие могут быть проблемы у Hello world.
Это ведь простая залача на 10 мин.
Бери, делай, а потом вопросы....через 10 мин.
...
Потоки контроллируй и потом расскажешь.
...
Рейтинг: 0 / 0
06.09.2018, 16:21
    #39699152
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Бесконтрольно плодить потоки конечно не стоит, поэтому лучше будет использовать ThreadPoolExecutor, например.
...
Рейтинг: 0 / 0
06.09.2018, 16:27
    #39699160
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Очень похоже на наивную попытку сделать свой async-call.

Убежден что задача автора решается по другому. Если это конечно не лаба где препод хочет чистые потоки.
...
Рейтинг: 0 / 0
06.09.2018, 16:30
    #39699162
pavel_nv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ipИ через определенный интервал создавать в цикле отдельные потоки для апдейта для каждого ID'шника.
...
По идее апдейт будет не ресурсоемким, но может быть продолжительным.

ты так весь пул подключений к БД забьешь. Такие операции лучше делать с помощь batchUpdate сторого в одном потоке.
+ имхо лучше не городить свои потоки, а использовать SpringScheduler (fxiedDelay) там хоть второй раз таска не запустится, если первый будет выполняться дольше чем delay
...
Рейтинг: 0 / 0
06.09.2018, 16:44
    #39699176
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ip,

В зависимости от того на сколько критичен определенный интервал времени, лучше использовать ScheduledExecutorService или Quartz
...
Рейтинг: 0 / 0
06.09.2018, 16:50
    #39699181
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
это ноги растут от сюда 21667055
...
Рейтинг: 0 / 0
06.09.2018, 16:57
    #39699184
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
вадяэто ноги растут от сюда 21667055 ну.
Свой список сессий делает.
Пусть делает.
Какая тут оптимизация если ничего нет?
Почему прерывание апдейт может быть долгим, если можно в очередь поставить?
...
Рейтинг: 0 / 0
06.09.2018, 17:01
    #39699186
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
По сабжу, таймер может порождать фоновый поток, может работать в том же, а может ставить в очередь заданий и тогда фоновый не нужен.
Все три варианта рабочие.
...
Рейтинг: 0 / 0
07.09.2018, 14:58
    #39699684
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Вот код, который набросал (пинать не сильно, раньше особо с потоками не работал)

Код: 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.
   public static void main(String[] args){
	updaterJobAsync();
	...
	//here other logic
	...

   }

   private static void senderJobAsync() {
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("Task started");

		for(Long el : usersList){
		   Runnable task = new Runnable() {
                      @Override
                      public void run() {
                         try {
                            ...
                            //here logic: connect to database and update row by ID
                            ...
                         } catch (Exception ex) {
                            System.out.println("Error: " + ex);
                         }
                         Thread.currentThread().interrupt();
                       }
                    };
                   new Thread(task, "msgThreadUsr_" + k).start();
                   System.out.println("THREAD threadUsr_" + k + " CREATED");
		}
                System.out.println("Task ended");
            }
        };
        timer.schedule(timerTask, 0, 10000);
   }



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

Если поток активный (все еще проадпдейтится запись) для пользователя с user_id=1, то при попытке создания нового потока для него же, пропускать до следующего цикла.

В коде поставил Thread.currentThread().interrupt(); для принудительного "кила" потока - не факт что правильно.
...
Рейтинг: 0 / 0
07.09.2018, 14:59
    #39699685
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
вадяэто ноги растут от сюда 21667055
Нее, там другая задача )))
...
Рейтинг: 0 / 0
07.09.2018, 15:07
    #39699694
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ipВот код, который набросал
Под Java 1.4 пишешь?
...
Рейтинг: 0 / 0
07.09.2018, 15:11
    #39699700
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Blazkowicz,нет, 7, просто, какие примеры нагуглил ))) так и написал
...
Рейтинг: 0 / 0
07.09.2018, 15:19
    #39699703
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ip,
Зачем тебе потоки, да ещё на select?
...
Рейтинг: 0 / 0
07.09.2018, 15:20
    #39699704
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ipПока не знаю, как лучше контролировать, чтобы в каждый момент времени создавался только один поток для одного пользователя:один на всех и цикл
...
Рейтинг: 0 / 0
07.09.2018, 15:22
    #39699706
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Petro123qi_ip,
Зачем тебе потоки, да ещё на select?
Чтобы в определенный момент времени можно было апдейтить записи по каждому пользователю, который появляется в списке.
Там идет сначала select и потом update.
...
Рейтинг: 0 / 0
07.09.2018, 15:24
    #39699707
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Непонятно. Я не увидел в топике никаких оснований для мультипоточности. Есть сеансовые потоки. В их рамках можно сделать все.
...
Рейтинг: 0 / 0
07.09.2018, 15:24
    #39699708
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Timer, TimerTask, new Thread - не нужены. Есть ScheduledExcutorService
Цикл не нужен. Есть стрим.
Анонимный класс не нужен. Есть лямды.
Thread.interrupt() не нужен в принципе.
Единственное для чего я не знаю нормального современного решения это try catch который в подобных задачах таки нужно писать явно.
...
Рейтинг: 0 / 0
07.09.2018, 15:30
    #39699713
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Petro123qi_ipПока не знаю, как лучше контролировать, чтобы в каждый момент времени создавался только один поток для одного пользователя:один на всех и цикл
ИМХО, не совсем подходит.
Если еще дальше углубиться, то суть в чем: что в базе периодически появляются новые записи, например, со статусом 0 для апдейта на статус 1 для любого пользователя. В списке userlist хранятся онлайн пользователи (это при работе с вебсокетом).

Соответственно, они "входят и выходят". И для тех, которые онлайн нужно проапдейтить новые записи максимально быстро. Поэтому решил, что с потоками будет быстрее. Так как если список будет слишком большой, последний пользователь из списка будет долго ждать, когда до него дойдет очередь.
А с потоками получается так, что крутится какой-то процесс, который периодически смотрит этот список и создает отдельные микрозадачи каждые в своем потоке.
...
Рейтинг: 0 / 0
07.09.2018, 15:38
    #39699719
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ipИ для тех, которые онлайн нужно проапдейтить новые записи максимально быстро. Поэтому решил, что с потоками будет быстрее.
Не факт что будет быстрее. Пула потоков нет. Обновить несколько записей БД одним запросом на много быстрее чем сделать тоже самое из кучи конкурирующих запросов.
...
Рейтинг: 0 / 0
07.09.2018, 15:45
    #39699728
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ip,
Не надо потоков.
И бд тоже зачем?
В оперативке же список юзверей
...
Рейтинг: 0 / 0
07.09.2018, 15:48
    #39699731
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
qi_ipсоздает отдельные микрозадачи каждые в своем потоке.хотя бы время озвучил микрозадачи и задержку таймера.
...
Рейтинг: 0 / 0
07.09.2018, 15:48
    #39699732
qi_ip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Создание потоков из Timer
Blazkowiczqi_ipИ для тех, которые онлайн нужно проапдейтить новые записи максимально быстро. Поэтому решил, что с потоками будет быстрее.
Не факт что будет быстрее. Пула потоков нет. Обновить несколько записей БД одним запросом на много быстрее чем сделать тоже самое из кучи конкурирующих запросов.
Нюанс в том, что я не могу это объединить в общий запрос для апдейта, так как по каждой записи, которую сделал select по сокету каждому пользователю отправляю сообщение.
С пулом потоков будет быстрее?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Создание потоков из Timer / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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