启动了几个工作线程,需要通知他们停止。由于有些线程会在下一轮工作之前暂停一段时间,因此需要一种即使在睡觉时也能通知它们的方法。
如果是Windows编程,我可以使用Event和wait函数。在Java中我通过使用CountDownLatch对象来做到这一点,该对象的计数为1.它工作但感觉不优雅,特别是我必须检查计数值以查看是否需要退出:
run(){
while(countDownLatch.count()>0){
//working
// ...
countDownLatch.wait(60,TimeUnit.SECONDS);
}
}
信号量是另一种选择,但也感觉不对。我想知道有没有更好的方法呢?谢谢。
答案 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
}
请记住中断时的两种情况:
sleep
或wait
则会抛出InterruptedException
; 答案 3 :(得分:0)
另一种最佳方法是使用interrupt( )
方法。
E.g以下是线程如何使用此信息来确定是否应该终止:
public class TestAgain extends Thread {
// ...
// ...
public void run( ) {
while (!isInterrupted( )) {
// ...
}
}
}
答案 4 :(得分:0)
要拥有一个线程池,我会使用ExecutorService或ScheduledExecutorService来执行延迟/定期任务。
当您希望工人停止时,您可以使用
executorService.shutdown();