我不断从一个线程中的线程获得一个中断,它不会让我因为它而破坏主线程。我仍然想使用Thread.sleep()来减慢循环。
主线程
startEngine.setOnAction((ActionEvent e) -> {
executor.submit(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
lifeInstance.runEngine();
}
}
});
});
stopEngine.setOnAction((ActionEvent e) -> {
executor.shutdownNow();
});
executor.submit正在调用lifeInstance.runEngine():
public void runEngine() {
//logic...
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
Logger.getLogger(LifeEngine.class.getName()).log(Level.SEVERE, null, ex);
return;
}
}
ERRROR:
//从runEngine()
中打印出来的东西Nov 06, 2016 6:04:52 PM thecell.LifeEngine runEngine
SEVERE: null
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at thecell.LifeEngine.runEngine(LifeEngine.java:66)
at UIControls.RightControls$1.run(RightControls.java:48)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
//继续打印runEngine()
中的内容答案 0 :(得分:1)
由于isInterrupted()
返回false
,runEngine()
方法会在InterruptedException
上返回。
从“Java Concurrency in Practice”一书中可以看出:
阻止
Thread.sleep
和Object.wait
等库方法尝试检测 当一个线程被中断并提前返回时。他们通过清除中断状态并抛出InterruptedException 来响应中断, 表示由于中断而阻塞操作提前完成。
当您收到异常时,将清除中断状态。您可以在返回之前重置它:
} catch (InterruptedException ex) {
Logger.getLogger(LifeEngine.class.getName()).log(Level.SEVERE, null, ex);
Thread.currentThread().interrupt();
return;
}
实际上,你应该这样做是因为你的任务代码是由一个线程池执行的,并且在你的任务代码处理它之后保持中断状态是很好的行为。这样线程池也可以响应中断。