Java 如何在等待时终止线程?
我试图用中断调用来阻止那些线程。我得到了一个中断异常Java 如何在等待时终止线程?,java,multithreading,Java,Multithreading,我试图用中断调用来阻止那些线程。我得到了一个中断异常 public void stop(){ setRun(false); inComingWorkThread.interrupt(); outGoingWorkThread.interrupt(); } 问题是getWokrOrder调用wait,如果这次发生中断,则不会终止线程。。如何安全地终止被阻止的线程?提前感谢。您可以随时将mRunning作为条件添加到wait()循环中getWorkOrder(): 现在,当
public void stop(){
setRun(false);
inComingWorkThread.interrupt();
outGoingWorkThread.interrupt();
}
问题是getWokrOrder调用wait,如果这次发生中断,则不会终止线程。。如何安全地终止被阻止的线程?提前感谢。您可以随时将
mRunning
作为条件添加到wait()
循环中getWorkOrder()
:
现在,当您中断线程时,循环条件将不为true,您将退出
wait()
循环。您还需要确保实际上有一个要返回的订单(如上所示),并且您还必须在run()
循环中添加一个空检查(未显示)。我认为这是因为您捕获了中断异常并继续循环
异常处理
有两种方法可以解决此问题:
捕获循环外部的InterruptedException
并返回null
while(mWorkOrderList.size() == 0 && mRunning){
try {
this.wait();
} catch (InterruptedException e) {e.printStackTrace();}
}
if (mWorkOrderList.size() > 0) {
return mWorkOrderList.poll();
}
return null;
使用此选项,您需要处理getWorkOrder()
在run()方法中返回null
的情况:
public synchronized WorkOrder getWorkOrder() {
WorkOrder workOrder = null;
try {
while(mWorkOrderList.size() == 0) {
this.wait();
}
mworkOrder = WorkOrderList.poll();
} catch (InterruptedException e) {
e.printStackTrace();
}
return workOrder;
}
或者第二,您可以抛出InterruptedException
并强制您的run()
方法对其进行处理
if (workOrder != null) {
//do something
}
打断
作为旁注,不需要维护mRunning
变量。这正是中断为您所做的
而不是:
public synchronized WorkOrder getWorkOrder() throws InterruptedException {
while(mWorkOrderList.size() == 0){
this.wait();
}
return WorkOrderList.poll();
}
只要写下:
while(mRunning) {
WorkOrder workOrder = getWorkOrder();
//do something
}
然后你甚至不需要调用setRun(false)代码>完全正确!下面是一个关于中断的好教程:
while(mRunning) {
WorkOrder workOrder = getWorkOrder();
//do something
}
while(!Thread.interrupted()) {
WorkOrder workOrder = getWorkOrder();
//do something
}