如何杀死一个有一段时间(真实)的线程?

我正在尝试关闭线程池中的所有线程。

通常我会尝试:

        while(!Thread.currentThread().isInterrupted()) {...

要关闭 while 循环...

但是我有一个线程,它只包含

        while(!Thread.currentThread().isInterrupted()) {//which is true

这就是我关闭线程的方式:

pool.shutdownNow();

那么,您将如何关闭这样的线程呢?


答案 1

您可以添加一个布尔值 。volatileflag

public class Worker implements Runnable {

    volatile boolean cancel = false;
    @Override
    public void run() {

        while (!cancel) {
            // Do Something here
        }
    }

    public void cancel() {
        cancel = true;
    }
}

现在您只需致电

worker.cancel();

更新:

From Java doc of shutdownNow()

尝试停止所有正在执行的任务,暂停等待任务的处理,并返回等待执行的任务的列表。

除了尽最大努力停止处理主动执行的任务之外,这里没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何未能响应中断的任务可能永远不会终止

因此,您必须通过保留中断来定义中断策略

  catch (InterruptedException ie) {
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }

答案 2

相反,您可以使用自己创建的标志作为 while 循环的条件。

public class MyClass implements Runnable
{

    private volatile boolean running = true;

    public void stopRunning()
    {
        running = false;
    }

    public void run()
    {
        while (running)
        {

        }
        // shutdown stuff here
    }

}

现在,要阻止它,只需调用:

myClassObject.stopRunning();

这将使代码正常完成。