Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 11.08.2016
Сообщений: 25
1

ScheduledExecutorService останавливается

17.04.2017, 21:23. Показов 1389. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.

Коротко - есть класс "диалогового облачка", в котором мне нужно выполнять код раз в 75 мс
Использую следующее решение из java.util:
Java
1
2
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleAtFixedRate(new Cloud.MyTimerTask(this), period, period, TimeUnit.MILLISECONDS);
И когда облачко одно - все просто замечательно выполняется
но когда я создаю второе - одно из них может самопроизвольно заморозить этот таймер, и он перестаёт работать. Причём, когда облачко одно - всё замечательно выполняется.
Использовать один шелдер для всех облаков не получится, они должны выполнять этот код с разным интервалом.
scheduler помечен как private.

Таск таймера выглядит вот так:
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
class MyTimerTask implements Runnable {
        private Cloud exemp;
        private char lastSymbol;
        private int counter;
        MyTimerTask(Cloud exemp){
            this.exemp = exemp;
        }
        public void run() {
            Cloud.peek.stop();
            if (!Objects.equals(exemp.myLabel.getText().toString(), exemp.needString)) {
                StringBuilder temp = new StringBuilder();
                for (int i = 0; i <= counter; i++) {
                    temp.append(exemp.needString.charAt(i));
                    lastSymbol = exemp.needString.charAt(i);
                }
                counter++;
                if (lastSymbol != ' ' & lastSymbol != '\n') {
                    Cloud.peek.play();
                }
                exemp.myLabel.setText(temp.toString());
            }
            else{
                exemp.scheduler.shutdown();
            }
        }
    }
Да, так же отмечу, что needString статично и ничто его не может поменять, следовательно, Objects.equals(exemp.myLabel.getText().toString(), exemp.needString) даст true только и только тогда, когда строка выведется полностью, а таймер морозится уж точно не в конце строки, а в разных местах (может на первом символе остановиться, а может полностью адекватно пройти всю строчку).

Добавлено через 2 часа 41 минуту
//Пофиксил методом научного тыка, тему можно закрывать.)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.04.2017, 21:23
Ответы с готовыми решениями:

Повторяющееся событие, ScheduledExecutorService
Здравствуйте. Поясните пожалуйста, как можно реализовать уведомления, которые повторяются с...

Сделал управление персонажу(будущему) но когда я отпускаю кнопку, он не останавливается.
package game1; import java.awt.event.KeyEvent; public class Player { private int x = 0;...

Холодильник Whirlpool arc 4110/ix периодически останавливается на несколько часов, периодически останавливается на несколько часов, свет горит
Доброго времени суток, мастера. Холодильник Whirlpool arc 4110/ix (наклейки с номерами содраны) -...

Ремонт стиральная машина Вязьма Л-10 останавливается, машина Вязьма Л-10 останавливается на стирке
со слов прачек (машина останавливается на стирке на 15-20 минуте работы, выдает зумм и ошибку...

2
Эксперт Java
4091 / 3825 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 11
17.04.2017, 23:53 2
Как пофиксили?
0
0 / 0 / 1
Регистрация: 11.08.2016
Сообщений: 25
18.04.2017, 00:02  [ТС] 3
Унаследовал MyTimerTask от TimerTask, а не реализуя Runnable
Так-же
Java
1
2
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleAtFixedRate(new Cloud.MyTimerTask(this), period, period, TimeUnit.MILLISECONDS);
Заменил на
Java
1
2
3
timer = new Timer(true); //(private static, создаётся один раз для всех)
timerTask = new MyTimerTask(); //(private, создаётся для каждого экземпляра отдельно) 
timer.scheduleAtFixedRate(timerTask, period, period); //добавление в очередь timer'a задачи timerTask()
Не знаю почему, но это сработало
0
18.04.2017, 00:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2017, 00:02
Помогаю со студенческими работами здесь

Компьютер запускается и останавливается, запускается и останавливается
Компьютер стартует, но останавливается. 9gMK3QwNh6Q Все перебрал, перечистил. Вытягиваешь провод...

Останавливается программа
Программа выводит на экран сообщения и если прислали сообщение &quot;привет&quot; , то она отвечает, но после...

Сервис не останавливается
Вот активити по нажатию на кнопку Start запускает сервис import android.content.Intent; import...

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


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

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