在我的项目中,我有一个图表可以变成动画,具体取决于我们是否单击“开始”或“停止”按钮。我可以开始,但我不知道如何阻止它。方法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();
}
}
答案 0 :(得分:1)
根据java文档,shutdownNow()
的工作原理如下。
除了努力尝试停止处理之外,没有任何保证 积极执行任务。例如,典型的实现方式 通过{@link Thread#interrupt}取消,所以任何失败的任务 响应中断可能永远不会终止。
因此,它会将中断标志设置为true,因此您需要正确管理InterruptedException
和/或明确检查Thread.currentThread().isInterrupted()
。您可以使用以下代码来停止当前运行的输入线程。
while (!Thread.currentThread().isInterrupted()) {
// your code here
}
答案 1 :(得分:0)
(!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();
}