powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Создание потоков из Timer
42 сообщений из 42, показаны все 2 страниц
Создание потоков из Timer
    #39699060
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

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

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

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

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

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

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

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

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

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

Соответственно, они "входят и выходят". И для тех, которые онлайн нужно проапдейтить новые записи максимально быстро. Поэтому решил, что с потоками будет быстрее. Так как если список будет слишком большой, последний пользователь из списка будет долго ждать, когда до него дойдет очередь.
А с потоками получается так, что крутится какой-то процесс, который периодически смотрит этот список и создает отдельные микрозадачи каждые в своем потоке.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699719
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipИ для тех, которые онлайн нужно проапдейтить новые записи максимально быстро. Поэтому решил, что с потоками будет быстрее.
Не факт что будет быстрее. Пула потоков нет. Обновить несколько записей БД одним запросом на много быстрее чем сделать тоже самое из кучи конкурирующих запросов.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699728
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Не надо потоков.
И бд тоже зачем?
В оперативке же список юзверей
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699731
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipсоздает отдельные микрозадачи каждые в своем потоке.хотя бы время озвучил микрозадачи и задержку таймера.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699732
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczqi_ipИ для тех, которые онлайн нужно проапдейтить новые записи максимально быстро. Поэтому решил, что с потоками будет быстрее.
Не факт что будет быстрее. Пула потоков нет. Обновить несколько записей БД одним запросом на много быстрее чем сделать тоже самое из кучи конкурирующих запросов.
Нюанс в том, что я не могу это объединить в общий запрос для апдейта, так как по каждой записи, которую сделал select по сокету каждому пользователю отправляю сообщение.
С пулом потоков будет быстрее?
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699739
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123qi_ipсоздает отдельные микрозадачи каждые в своем потоке.хотя бы время озвучил микрозадачи и задержку таймера.
Сложно сказать, так как пока в режиме теста (подбор возможных вариантов). По сути, задержка таймера по минимуму. Время на микрозадачу: селект записи по userId, считывание данных строки в переменную, отправка по вебсокету этих данных, апдейт статуса строки - конец задачи. Сколько займет времени пока не замерял - нужно чем быстрее, тем лучше.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699750
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Если врубить второй кэш в хибере, то и в базу не надо лезть).
...
Преждевременная оптимизация называется.
Тесты нужны.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699757
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123qi_ip,
Если врубить второй кэш в хибере, то и в базу не надо лезть).
...
Преждевременная оптимизация называется.
Тесты нужны.

К сожалению, хибер тут не используется (((
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699769
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipНюанс в том, что я не могу это объединить в общий запрос для апдейта, так как по каждой записи, которую сделал select по сокету каждому пользователю отправляю сообщение.
С пулом потоков будет быстрее?
И что, транзакции висят пока сообщение не будет отправлено? Только потом комитяться? Это же пипец базе, залочится всё нахрен.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699778
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИ что, транзакции висят пока сообщение не будет отправлено?
+1
Аффтар!
Решение без коммита:
При новой сессии отпраляем все что спросит.
При каждой отправке пишем в оперативку тайштамп время последней отправки.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699796
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczqi_ipНюанс в том, что я не могу это объединить в общий запрос для апдейта, так как по каждой записи, которую сделал select по сокету каждому пользователю отправляю сообщение.
С пулом потоков будет быстрее?
И что, транзакции висят пока сообщение не будет отправлено? Только потом комитяться? Это же пипец базе, залочится всё нахрен.
Делаю селект, отправляю сообщение с данными из селекта, делаю апдейт. При селекте, разве база лочится?


Petro123BlazkowiczИ что, транзакции висят пока сообщение не будет отправлено?
+1
Аффтар!
Решение без коммита:
При новой сессии отпраляем все что спросит.
При каждой отправке пишем в оперативку тайштамп время последней отправки.
И потом общий апдейт?
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699803
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipДелаю селект, отправляю сообщение с данными из селекта, делаю апдейт. При селекте, разве база лочится?
Тогда всё ещё не понятно почему нужно делать апдейты в отдельных потоках?
Получили список ID. Сделали по нему выборку. Отправили всем сообщения. Потом батч-апдейтом накатили всем то кого пришло подтверждение.

Вы изобретаете потоки там где они не нужны. Потоки вам по факту нужны только чтобы отправлять сообщения.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699806
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipИ потом общий апдейт?о чем?
Незачем сохранять в базу вообще.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39699811
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipPetro123пропущено...
хотя бы время озвучил микрозадачи и задержку таймера.
Сложно сказать, так как пока в режиме теста (подбор возможных вариантов). По сути, задержка таймера по минимуму. Время на микрозадачу: селект записи по userId, считывание данных строки в переменную, отправка по вебсокету этих данных, апдейт статуса строки - конец задачи. Сколько займет времени пока не замерял - нужно чем быстрее, тем лучше.
Дружище. Я читаю уже много постов и не пойму какая решается задача.
Классическая работа с бд в режиме OLTP не требует каких то фоновых потоков и ухищрений.
Либо у тебя в бд уже есть проблема и ее надо решать в бд. Плодить потоки можно в java бесконечно много но это не помогает работе БД.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700247
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczТогда всё ещё не понятно почему нужно делать апдейты в отдельных потоках?
Получили список ID. Сделали по нему выборку. Отправили всем сообщения. Потом батч-апдейтом накатили всем то кого пришло подтверждение.

Вы изобретаете потоки там где они не нужны. Потоки вам по факту нужны только чтобы отправлять сообщения.
Понятно, согласен, что для апдейтить в потоке может быть не правильно, единственный нюанс который я вижу, что апдейты будут не успевать за отправками сообщениями, но тут чисто ИМХО, так как еще не протестировал.

Petro123qi_ipИ потом общий апдейт?о чем?
Незачем сохранять в базу вообще.
Мне нужно проапдейтить запись, для кого было отправлено сообщение.

maytonДружище. Я читаю уже много постов и не пойму какая решается задача.
Классическая работа с бд в режиме OLTP не требует каких то фоновых потоков и ухищрений.
Либо у тебя в бд уже есть проблема и ее надо решать в бд. Плодить потоки можно в java бесконечно много но это не помогает работе БД..
Потоки появились из-за необходимости через вебсокет отправлять сообщения определенным пользователям с максимальной скоростью доставки, а апдейтить, как уже написал Blazkowicz можно не в потоке, а батч-апдейтом.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700252
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipМне нужно проапдейтить запись, для кого было отправлено сообщение.десять раз спросить?
Зачем это нужно?
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700255
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123qi_ipМне нужно проапдейтить запись, для кого было отправлено сообщение.десять раз спросить?
Зачем это нужно?
Пометить что для данного пользователя определенный текст был отправлен и не отправлять в следующий раз.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700260
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Я же привел вариант.
При старте сессии ты отправляешь клиенту все мессаги что попросит.
Он же их не хранит у себя.
А потом хранишь не в базе а в оперативке.
Вариант?
Тогда апдейт не нужен.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700262
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Помечают в базе когда БЛ в базе. Например, хранимка JOB.
У тебя БЛ не в базе.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700264
qi_ip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Petro123qi_ip,
Я же привел вариант.
При старте сессии ты отправляешь клиенту все мессаги что попросит.
Он же их не хранит у себя.
А потом хранишь не в базе а в оперативке.
Вариант?
Тогда апдейт не нужен.
Согласен, вариант, но тогда в моем случае, если не будет помечено, что данному пользователю конкретное сообщение было послано, после потенциальной перезагрузке сервера все сообщения опять заново полетят, что не нужно.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700267
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ip,
Нет))). Будет опять реконнект и новая сессия.
Короче, делай потоки хоть на select.
Аргументы кончились.
...
Рейтинг: 0 / 0
Создание потоков из Timer
    #39700269
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qi_ipПотоки появились из-за необходимости через вебсокет отправлять сообщения определенным пользователям с максимальной скоростью доставки, а апдейтить, как уже написал Blazkowicz можно не в потоке, а батч-апдейтом.тонким местом будет перебор листа с пользователями кому надо отправлять.
qi_ipкак уже написал Blazkowicz можно не в потоке, а батч-апдейтом.это да, но только пока ты заполняешь этот батч, а как заполнишь - будешь ждать пока он выполнится....
вот тут их можно разнести на потоки 2батча - 2 потока. но вопрос а субд справится?
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Создание потоков из Timer
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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