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