5

可能重复:
你如何杀死 Java 中的线程?
如何在 Java 中启动/停止/重新启动线程?

Thread具有以下功能:

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

但它们都已被弃用。
你用什么来停止线程?

4

6 回答 6

4

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

检查这个以获得解释。

于 2012-10-21T07:24:04.530 回答
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

于 2012-10-21T07:24:56.613 回答
2

你可以这样做:

private boolean running = true;

public void stop () {
    running = false;
}    

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

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

于 2012-10-21T07:26:53.570 回答
2

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

询问您使用Thread.interrupt()哪个会抛出InterruptedException(如果线程正在等待)或在线程中设置标志(如果不等待)。

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

于 2012-10-21T07:27:04.607 回答
0

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

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

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

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

显然你可以通过发送 sing 来改进机制

于 2012-10-21T07:31:25.913 回答
0

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

于 2012-10-21T07:44:32.890 回答