可能重复:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?如何停止Java线程?
Thread
具有以下功能:
destroy()
stop()
suspend()
,但他们都已过时。
你用什么来阻止线程?
可能重复:
How do you kill a thread in Java?
How to start/stop/restart a thread in Java?如何停止Java线程?
Thread
具有以下功能:
destroy()
stop()
suspend()
,但他们都已过时。
你用什么来阻止线程?
你应该确保它只是运行/退出时,它应该。
检查this的解释。
您可以使用布尔标志来停止线程。你也可以利用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
你可以做这样的:
private boolean running = true;
public void stop() {
running = false;
}
public void run() {
while (running) {
//your code goes here
}
}
这让游程的只是一个简单的方法方法简单地消失。
+1运行需要'volatile',否则run()可能永远不会停止。 –
你问他礼貌地结束它的工作。该线程应该表现良好,并且在问及时应该结束它的工作。
要求您使用Thread.interrupt()
,这将引入InterruptedException
(如果线程正在等待)或在线程中设置标志(如果不等待)。
线程应该在捕获InterruptException
时退出它的工作,或者如果它做了很长时间的工作(没有睡眠/等待),它应该不时检查它是否被中断,如果是,则退出。
您提到的方法已被弃用,因为一旦使用它们可能会使系统处于不稳定状态:它就像杀死进程一样。使用这些方法不会给线程任何优雅退出的机会。
结论是,你正在执行的每个线程应该有它自己的优雅退出机制。通常你会做以下事情。创建boolean
标志exit
默认为false
。该线程的run()
方法应该实现循环,如:
while (!exit) {
// do the job
}
Add方法exit()
,轮流此标志true
,所以当该方法是从外面叫你的线程将离开while
循环的下一次迭代。退出时你应该关心关闭资源等。
很明显,你可以通过发送唱
任何线程运行,以完成其工作,完善机制。如果有更多的工作要做,它应该确定自己。当你想停止工作线程时,这意味着线程认为工作存在,但你不希望线程去做。这在你的设计中肯定是一个问题。在设计良好的问题中,不需要停止/恢复线程。
你不停止一个线程,只是让'run'方法完成它的执行。 –
您能否详细说明您的用例,说明您为什么要停止线程? – Vikdor
为了完整性,另一种方法是终止整个过程 - 这将起作用。 –