Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.10.2023
Сообщений: 21
1

Обновление таймера

26.02.2024, 14:56. Показов 305. Ответов 4

Author24 — интернет-сервис помощи студентам
Всем салют. Прошу помощи в решении небольшой задачки.
Я тут делаю веб-приложение таймер. Суть простая: пользователь нажимает кнопку, и через некоторое время(скажем через 1 минуту), ему приходит сообщение. Алгоритм такой:
1. Пользователь нажимает кнопку
2. Запускается таймер на 1 минуту
3. Спустя 1 минуту выполняется задание таймера -, приходит сообщение.
Эту часть функционала я реализовал с помощью старого доброго класса Timer и TimerTask. Я пошёл дальше, и решил модифицировать данную функцию:
1. Пользователь нажимает кнопку
2. Запускается таймер на 1 минуту
3. В течение минуты пользователь нажимает кнопку ещё раз
4. Таймер сбрасывается, и запускается заново. Отправка сообщения отсрочивается ещё на 1 минуту
В последствии, планировалась добавить ещё кнопки, что отсрочивали отправку на 2, 5 или больше минут.
Изначально, я думал что при регистрации пользователя, в специально отведённой Map-таблице будет создаваться его личный таймер с ключом-значением <id пользователя, Timer>, и изначально просто думал что буду обращаться к таблице, прерывать таймер методом cancel(), и запускать его заново, но пока писал код, осознал что делаю глупость, ибо таймер как поток будет выполнять все задачи, и надо прерывать не таймер, а задачи TimerTask. Начал думать над этим вариантом и понял что это возможно будет довольно громоздкий код. Позже решил обдумать исполнение подобного с использованием класса Duration, и в итоге голову сломал.
Сейчас всё же попробую реализовать подобное с использованием TimerTusk, а пока жду советов и предложений. Если какой нибудь удобный и элегантный способ реализации такого алгоритма? Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2024, 14:56
Ответы с готовыми решениями:

Обновление таймера
Здравствуйте. Такой вопрос. У меня есть таблица, из которой берутся значения времени в секундах и...

Обновление таймера ?
Всем привет, совсем не давно начал изучать JavaScript и вот столкнулся с такой проблеммой, написал...

Обновление формы из таймера
Добрый день,спасибо,что откликнулись на мой призыв У меня есть два класса Form1 и Timer Timer: ...

авто обновление таймера
Такая проблема. Установил таймер, http://sergeysolodov.com/demo/countdown/ этот. Вроде все...

Обновление страницы после завершения подсчета таймера
как можно сделать таймер на обновлении страницы? Чтобы стартовое значение можно было задавать через...

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
Займет это все минимум потоков (сколько укажете).
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
39
40
41
42
43
private static class SimpleTaskThreadFactory implements ThreadFactory {
        private static SimpleTaskThreadFactory SHARED_INSTANCE = new SimpleTaskThreadFactory();
        private ThreadGroup _group = new ThreadGroup("SimpleTask");
        private AtomicInteger _id = new AtomicInteger(1);
 
        private SimpleTaskThreadFactory() {
 
        }
 
        @Override
        public Thread newThread(Runnable r) {
            Thread result = new Thread(_group, r);
            result.setPriority(Thread.NORM_PRIORITY);
            result.setName("SimpleTaskThread" + _id.getAndIncrement());
            return result;
        }
 
}
 
private static class SimpleTaskExecutionHandler implements
            RejectedExecutionHandler {
        private static SimpleTaskExecutionHandler SHARED_INSTANCE = new SimpleTaskExecutionHandler();
 
        @Override
        public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
            if (executor.isShutdown())
                return;
            new Thread(r).start();
        }
 
}
 
private ScheduledThreadPoolExecutor _taskScheduler = new ScheduledThreadPoolExecutor(
            5, SimpleTaskThreadFactory.SHARED_INSTANCE,
            SimpleTaskExecutionHandler.SHARED_INSTANCE);
 
    public Future<?> scheduleOnce(Runnable task, long interval) {
        if(interval <= 0) {
            _taskScheduler.execute(task);
            return null;
        } else
            return _taskScheduler.schedule(task, interval, TimeUnit.MILLISECONDS);
    }
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
Цитата Сообщение от MrEntropy Посмотреть сообщение
Метод newThread- инициализирует новый поток.
Да, если все потоки в пуле "закончились", а надо "прям сейчас" создается новый поток
Цитата Сообщение от MrEntropy Посмотреть сообщение
Метод scheduleOnce запускает новую задачу через определённый интервал
Правильно
Цитата Сообщение от MrEntropy Посмотреть сообщение
Метод rejectedExecution- перезапускает поток. Я всё правильно понял?
А вот тут нет. Пул может "отвергнуть" задачу, и тогда вызывается RejectExceutionHandler
Если вам надо снять задачу, то у Future дерните cancel.
Цитата Сообщение от MrEntropy Посмотреть сообщение
И я не понял, переменная снизу ScheduledThreadPoolExecutor, в каком классе лежит?
В каком хотите. Это кусок моего класса, для исполнения задач.
Только не забудте его еще правильно шатдаунить.
И вообще, есть такая чудная книга Java Concurrency in Practice. Настоятельно рекомендую к прочтению
0
27.02.2024, 11:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2024, 11:03
Помогаю со студенческими работами здесь

Как сделать обновление страницы после отключеия таймера
Подскажите пожалуйста, как сделать автоматическое обновление страницы после отключения таймера с...

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

Помогите опознать диодный мост таймера духовки Hansa BOEM 624000, диодный мост таймера
Помогите опознать диодный мост таймера духовки Hansa BOEM 624000 мост смд маленький примерно...

Не могу установить обновление KB2670838 (Обновление платформы для Windows 7)
Не могу установить обновление KB2670838(Обновление платформы для Windows 7). Запускаю .msu файл,...

Обновление базы и ошибка: Обновление невозможно. База данных или объект доступны только для чтения.
Помогите пожалуйста! asp не может обновить базу. Про ошибку говорит Microsoft OLE DB Provider for...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru