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
}