0 / 0 / 0
Регистрация: 10.10.2023
Сообщений: 21
|
|
1 | |
Обновление таймера26.02.2024, 14:56. Показов 305. Ответов 4
Всем салют. Прошу помощи в решении небольшой задачки.
Я тут делаю веб-приложение таймер. Суть простая: пользователь нажимает кнопку, и через некоторое время(скажем через 1 минуту), ему приходит сообщение. Алгоритм такой: 1. Пользователь нажимает кнопку 2. Запускается таймер на 1 минуту 3. Спустя 1 минуту выполняется задание таймера -, приходит сообщение. Эту часть функционала я реализовал с помощью старого доброго класса Timer и TimerTask. Я пошёл дальше, и решил модифицировать данную функцию: 1. Пользователь нажимает кнопку 2. Запускается таймер на 1 минуту 3. В течение минуты пользователь нажимает кнопку ещё раз 4. Таймер сбрасывается, и запускается заново. Отправка сообщения отсрочивается ещё на 1 минуту В последствии, планировалась добавить ещё кнопки, что отсрочивали отправку на 2, 5 или больше минут. Изначально, я думал что при регистрации пользователя, в специально отведённой Map-таблице будет создаваться его личный таймер с ключом-значением <id пользователя, Timer>, и изначально просто думал что буду обращаться к таблице, прерывать таймер методом cancel(), и запускать его заново, но пока писал код, осознал что делаю глупость, ибо таймер как поток будет выполнять все задачи, и надо прерывать не таймер, а задачи TimerTask. Начал думать над этим вариантом и понял что это возможно будет довольно громоздкий код. Позже решил обдумать исполнение подобного с использованием класса Duration, и в итоге голову сломал. Сейчас всё же попробую реализовать подобное с использованием TimerTusk, а пока жду советов и предложений. Если какой нибудь удобный и элегантный способ реализации такого алгоритма? Заранее спасибо
0
|
26.02.2024, 14:56 | |
Ответы с готовыми решениями:
4
Обновление таймера Обновление таймера ? Обновление формы из таймера авто обновление таймера Обновление страницы после завершения подсчета таймера |
103 / 44 / 10
Регистрация: 12.12.2023
Сообщений: 245
|
|
26.02.2024, 17:48 | 2 |
Насколько я знаю правильный способ решедулить TimerTask это именно cancel таймера и создание нового
Тут единственный подводный камень это не напортачить с синхронизацией, потому-что когда вы реализуете логику "если задача еще не выполнялась - оборвать ее и создать новую" задача может стартовать именно в тот момент где в тексте находится тире "-", то есть после проверки и до cancel. И все кто думают "да это совершенно невероятно" обязательно на это нарвутся, проверено
0
|
326 / 165 / 41
Регистрация: 07.01.2023
Сообщений: 593
|
||||||
26.02.2024, 19:46 | 3 | |||||
Вообще есть такой чудесный класс как ScheduledThreadPoolExecutor
Вы его можете накормить кучей Runnable, он для каждой вернет Future Займет это все минимум потоков (сколько укажете).
0
|
0 / 0 / 0
Регистрация: 10.10.2023
Сообщений: 21
|
|
27.02.2024, 09:32 [ТС] | 4 |
Спасибо, большое. Можно уточнить пару вещей:
Метод newThread- инициализирует новый поток. Метод scheduleOnce запускает новую задачу через определённый интервал Метод rejectedExecution- перезапускает поток. Я всё правильно понял? Добавлено через 16 минут Azathtot, Спасибо, большое. Можно уточнить пару вещей: Метод newThread- инициализирует новый поток. Метод scheduleOnce запускает новую задачу через определённый интервал Метод rejectedExecution- перезапускает поток. Я всё правильно понял? И я не понял, переменная снизу ScheduledThreadPoolExecutor, в каком классе лежит?
0
|
326 / 165 / 41
Регистрация: 07.01.2023
Сообщений: 593
|
|
27.02.2024, 11:03 | 5 |
Да, если все потоки в пуле "закончились", а надо "прям сейчас" создается новый поток
Правильно А вот тут нет. Пул может "отвергнуть" задачу, и тогда вызывается RejectExceutionHandler Если вам надо снять задачу, то у Future дерните cancel. В каком хотите. Это кусок моего класса, для исполнения задач. Только не забудте его еще правильно шатдаунить. И вообще, есть такая чудная книга Java Concurrency in Practice. Настоятельно рекомендую к прочтению
0
|
27.02.2024, 11:03 | |
27.02.2024, 11:03 | |
Помогаю со студенческими работами здесь
5
Как сделать обновление страницы после отключеия таймера Привязка таймера к попыткам ввода пароля и сообщение об оставшихся попыток и открытия формы с отчётом таймера Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера Не могу установить обновление KB2670838 (Обновление платформы для Windows 7) Обновление базы и ошибка: Обновление невозможно. База данных или объект доступны только для чтения. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |