Как перестать работать ScheduledExecutorService? - PullRequest
0 голосов
/ 26 апреля 2018

В моем проекте у меня есть график, который может превратиться в анимацию, в зависимости от того, нажмем ли мы кнопку Старт или Стоп. Я могу начать, но я не знаю, как это остановить. Метод 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 ]

0 голосов
/ 26 апреля 2018

(!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();
}
0 голосов
/ 26 апреля 2018

Согласно документации Java, shutdownNow() работает, как показано ниже.

Нет никаких гарантий, кроме попыток изо всех сил остановить обработку активно выполняющие задачи. Например, типичные реализации будут отменить через {@link Thread # interrupt}, так что любая задача, которая не может отвечать на прерывания никогда не может прекратить.

Таким образом, будет установлен флаг прерывания true, поэтому вам нужно правильно управлять InterruptedException и / или явно проверять Thread.currentThread().isInterrupted(). Вы можете использовать приведенный ниже код, чтобы остановить текущий запущенный ввод потока.

while (!Thread.currentThread().isInterrupted()) {
    // your code here           
}
...