2012-10-21 199 views
5

可能重复:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?如何停止Java线程?

Thread具有以下功能:

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

,但他们都已过时。
你用什么来阻止线程?

+0

你不停止一个线程,只是让'run'方法完成它的执行。 –

+0

您能否详细说明您的用例,说明您为什么要停止线程? – Vikdor

+0

为了完整性,另一种方法是终止整个过程 - 这将起作用。 –

回答

4

你应该确保它只是运行/退出时,它应该。

检查this的解释。

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

你可以做这样的:

private boolean running = true; 

public void stop() { 
    running = false; 
}  

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

这让游程的只是一个简单的方法方法简单地消失。

+1

+1运行需要'volatile',否则run()可能永远不会停止。 –

2

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

要求您使用Thread.interrupt(),这将引入InterruptedException(如果线程正在等待)或在线程中设置标志(如果不等待)。

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

0

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

结论是,你正在执行的每个线程应该有它自己的优雅退出机制。通常你会做以下事情。创建boolean标志exit默认为false。该线程的run()方法应该实现循环,如:

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

Add方法exit(),轮流此标志true,所以当该方法是从外面叫你的线程将离开while循环的下一次迭代。退出时你应该关心关闭资源等。

很明显,你可以通过发送唱

0

任何线程运行,以完成其工作,完善机制。如果有更多的工作要做,它应该确定自己。当你想停止工作线程时,这意味着线程认为工作存在,但你不希望线程去做。这在你的设计中肯定是一个问题。在设计良好的问题中,不需要停止/恢复线程。