另一个线程终止时终止Thread.Sleep()?

时间:2016-11-07 00:09:32

标签: java multithreading

我不断从一个线程中的线程获得一个中断,它不会让我因为它而破坏主线程。我仍然想使用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()

中的内容

1 个答案:

答案 0 :(得分:1)

由于isInterrupted()返回falserunEngine()方法会在InterruptedException上返回。

从“Java Concurrency in Practice”一书中可以看出:

  

阻止Thread.sleepObject.wait等库方法尝试检测   当一个线程被中断并提前返回时。他们通过清除中断状态并抛出InterruptedException 来响应中断,   表示由于中断而阻塞操作提前完成。

当您收到异常时,将清除中断状态。您可以在返回之前重置它:

} catch (InterruptedException ex) {
    Logger.getLogger(LifeEngine.class.getName()).log(Level.SEVERE, null, ex);
    Thread.currentThread().interrupt();
    return;
}

实际上,你应该这样做是因为你的任务代码是由一个线程池执行的,并且在你的任务代码处理它之后保持中断状态是很好的行为。这样线程池也可以响应中断。