如何停止Java线程?

时间:2012-10-21 07:21:05

标签: java multithreading

  

可能重复:
  How do you kill a thread in Java?
  How to start/stop/restart a thread in Java?

Thread具有以下功能:

  • destroy()
  • stop()
  • suspend()

但他们都被弃用了 你用什么来阻止一个线程?

6 个答案:

答案 0 :(得分:4)

你应该确保它只是在它应该的时候运行/退出。

检查this以获取解释。

答案 1 :(得分:3)

您可以使用布尔标志来停止线程。您还可以使用Thread.isInterrupted()检查线程是否被中断,并忽略与布尔标志相同的其余工作。

class Worker implements Runnable {
    private volatile boolean shouldRun = true;

    @Override
    public void run() {
        while (shouldRun) {
            // your code here
        }
    }

    public void cancel()
    {
        shouldRun = false;
    }
}

如果您想知道为什么不推荐使用这些功能,可以查看Java Thread Primitive Deprecation

答案 2 :(得分:2)

你可以这样做:

private boolean running = true;

public void stop () {
    running = false;
}    

public void run () {
    while (running) { 
        //your code goes here
    }
}

这只是让run-method消失的简单方法。

答案 3 :(得分:2)

你礼貌地问他结束它的工作。线程应该表现良好,并且应该在被问及时结束它的工作。

要求你使用Thread.interrupt(),它将投入InterruptedException(如果线程正在等待)或在线程中设置一个标志(如果没有等待)。

线程应该在它捕获InterruptException时退出它的工作,或者如果它做了很长时间的工作(没有睡眠/等待)它应该不时地检查它是否被中断并且如果是这样则退出。

答案 4 :(得分:0)

您提到的方法已被弃用,因为一旦使用它们可能会使系统处于不稳定状态:它就像杀死进程一样。使用这些方法不会给线程任何正常退出的机会。

结论是您正在实现的每个线程都应该有自己的优雅退出机制。通常,您执行以下操作。默认情况下,创建boolean exit false。线程的run()方法应该实现如下循环:

while (!exit) {
    // do the job
}

添加将此标志转换为exit()的方法true,因此当从外部调用该方法时,您的线程将在下一次迭代时离开while循环。退出时你应该关心关闭资源等。

显然你可以通过发送唱歌来改善机制

答案 5 :(得分:0)

任何线程都会运行来完成它的工作。它应该确定自己是否还有更多的工作要做。当你想要停止一个工作线程时,这意味着线程认为工作存在,但你不希望线程这样做。这绝对是您设计中的一个问题。在设计良好的问题中,不需要停止/恢复线程。