更好的方式来发信号通知其他线程停止?

时间:2011-07-28 13:25:11

标签: java

启动了几个工作线程,需要通知他们停止。由于有些线程会在下一轮工作之前暂停一段时间,因此需要一种即使在睡觉时也能通知它们的方法。

如果是Windows编程,我可以使用Event和wait函数。在Java中我通过使用CountDownLatch对象来做到这一点,该对象的计数为1.它工作但感觉不优雅,特别是我必须检查计数值以查看是否需要退出:

run(){
    while(countDownLatch.count()>0){
            //working
            // ...
            countDownLatch.wait(60,TimeUnit.SECONDS);
    }
}

信号量是另一种选择,但也感觉不对。我想知道有没有更好的方法呢?谢谢。

5 个答案:

答案 0 :(得分:8)

最佳方法是interrupt()工作线程。


Thread t = new Thread(new Runnable(){
    @Override
    public void run(){
        while(!Thread.currentThread().isInterrupted()){
            //do stuff
            try{
                Thread.sleep(TIME_TO_SLEEP);
            }catch(InterruptedException e){
                Thread.currentThread().interrupt(); //propagate interrupt
            }
        }
    }
});
t.start();

只要您引用t,“停止”t所需的全部内容就是调用t.interrupt()

答案 1 :(得分:0)

使用内置线程中断框架。要停止工作线程调用workerThread.interrupt(),这将导致某些方法(如Thread.sleep())抛出中断的异常。如果您的线程没有调用可中断的方法,那么您需要检查中断的状态。

在工作线程中:

run() {
    try {
        while(true) {
            //do some work
            Thread.sleep(60000);
        }
    }
    catch(InterruptedException e) {
        //told to stop working
    }
}

答案 2 :(得分:0)

好的方法是interrupt()个线程,内部线程就像

一样循环
try {
   while (!Thread.interrupted()) {
       ...
   }
} catch (InterruptedException e) {
   // if interrupted in sleep
}

请记住中断时的两种情况:

  • 如果您sleepwait则会抛出InterruptedException;
  • 在其他情况下,将为您必须自行检查的线程设置中断标志。

答案 3 :(得分:0)

另一种最佳方法是使用interrupt( )方法。

E.g以下是线程如何使用此信息来确定是否应该终止:

public class TestAgain extends Thread {
           //  ...
           //  ...
         public void run( ) {
               while (!isInterrupted( )) {
                  //    ...
                     }
                 }     
           }

答案 4 :(得分:0)

要拥有一个线程池,我会使用ExecutorServiceScheduledExecutorService来执行延迟/定期任务。

当您希望工人停止时,您可以使用

executorService.shutdown();