Как перестать работать ScheduledExecutorService?
В моем проекте у меня есть график, который может превратиться в анимацию в зависимости от того, нажмем ли мы кнопку "Старт" или "Стоп". Я могу начать, но я не знаю, как это остановить. Метод shutdownNow() не дает результата. Как я могу это сделать? Вот мой код
public class Animation extends JPanel{
// initializations
ScheduledExecutorService scheduler =
Executors.newScheduledThreadPool(1);
Animation(String s){
// initialization of chart and adding XYSeries
this.add(chartPanel);
}
public void go() {
scheduler.scheduleAtFixedRate( (new Runnable() {
@Override
public void run() {
double first;
l = dataset.getSeries();
while(true) {
first = (double)l.get(0).getY(0);
for (int k = 0; k < l.get(0).getItemCount(); k++) {
if (k + 1 < l.get(0).getItemCount()) l.get(0).updateByIndex(k, l.get(0).getY(k+1));
else l.get(0).updateByIndex(k, first);
}
}
}
}), 0, 5, MILLISECONDS);
}
public void stop() {
scheduler.shutdownNow();
}
}
2 ответа
(!Thread.currentThread().isInterrupted())
может быть решением
но лично я бы:
- извлекать бегуна в методе
- остановить бегун, щелкнув логическое
- вызов
scheduler.shutdownNow();
когда нужно (при закрытии JPanel?)
пример:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
boolean running;
public void setup() {
scheduler.scheduleAtFixedRate(runner(), 0, 5, TimeUnit.MILLISECONDS);
}
private Runnable runner() {
return () -> {
while (running) {
try {
//DO YOUR STUFF HERE
System.err.println("RUNNING");
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
public void go() {
running = true;
}
public void stop() {
running = false ;
}
public void shutdown() {
scheduler.shutdownNow();
}
public static void main(String[] args) throws InterruptedException {
Demo tasks = new Demo();
tasks.setup();
for (int i = 1; i <= 5; i++) {
System.err.println("GO FOR IT " + i);
tasks.go();
Thread.sleep(2000);
tasks.stop();
Thread.sleep(1000);
}
tasks.shutdown();
}
Согласно документам Java, как shutdownNow()
работает как ниже.
Нет никаких гарантий, кроме попыток изо всех сил прекратить обработку активно выполняемых задач. Например, типичные реализации будут отменены через {@link Thread#interrupt}, поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.
Таким образом, будет установлен флаг прерывания true, поэтому вам нужно правильно управлять InterruptedException
и / или явно проверить Thread.currentThread().isInterrupted()
, Вы можете использовать приведенный ниже код, чтобы остановить ваш текущий запущенный введенный поток.
while (!Thread.currentThread().isInterrupted()) {
// your code here
}