Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向其他线程发出停止信号的更好方法?_Java - Fatal编程技术网

Java 向其他线程发出停止信号的更好方法?

Java 向其他线程发出停止信号的更好方法?,java,Java,启动了多个工作线程,需要通知它们停止。由于某些线程在下一轮工作之前会休眠一段时间,因此需要一种即使在休眠时也能通知它们的方法 如果是Windows编程,我可以使用事件和等待函数。在Java中,我通过使用CountDownLatch对象来实现这一点,count为1。它可以工作,但感觉不优雅,特别是我必须检查计数值,看看是否需要退出: run(){ while(countDownLatch.count()>0){ //working //

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

如果是Windows编程,我可以使用事件和等待函数。在Java中,我通过使用CountDownLatch对象来实现这一点,count为1。它可以工作,但感觉不优雅,特别是我必须检查计数值,看看是否需要退出:

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

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

使用内置线程中断框架。要停止工作线程调用
workerThread.interrupt()
,这将导致某些方法(如thread.sleep())引发中断的异常。如果线程不调用可中断方法,则需要检查中断状态

在工作线程中:

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

好的方法是
interrupt()
threads,线程内部像循环一样循环

try {
   while (!Thread.interrupted()) {
       ...
   }
} catch (InterruptedException e) {
   // if interrupted in sleep
}
当do中断时,请记住这两种情况:

  • 如果您
    sleep
    wait
    则将抛出
    InterruptedException
  • 在其他情况下,将为您必须自己检查的线程设置中断标志
    • 最好的方法是使用辅助线程




      只要您有一个对
      t
      的引用,那么“停止”
      t
      所需要的就是调用
      t.interrupt()

      另一个最好的方法就是使用方法

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

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

      要拥有线程池,我将使用或来执行延迟/定期任务

      当你想让工人停止工作时,你可以使用

      executorService.shutdown();
      

      这不是您想要的答案,但是您应该使用线程池(java.util.concurrent)。我几乎可以肯定他们可以做你想做的事情,而且他们没有bug,你可以利用你的时间开发其他东西。你想停止所有线程,还是只停止少数线程?@Moonbeam我需要单独停止它们,所以线程池似乎不是一个可行的解决方案。@HourseArmor,然后是多数,如果不是所有给出的答案都合适的话。我喜欢你提到的事实,因为中断标志被清除,所以再次中断。不过他必须使用shutdownNow()。
      executorService.shutdown();