好吧,我的视频转换器中有一个线程负责转码视频。它是user thread
setDaemon(false)
。
要停止它,我会调用threadName.interrupt()
方法,但它不会停止。它继续!
如何阻止它?
以下是我试图阻止它的方法:
if(getExecutingTaskID() == taskID){
int what = JOptionPane.showOptionDialog(frame,
"Do you want to interrupt an executing task?",
"Task already running",
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null, null, null);
if(what == JOptionPane.YES_OPTION){
if(getExecutingTaskID() == taskID){
converter.interrupt();
}
return true;
}
}
return false;
}
答案 0 :(得分:4)
线程只有在调用抛出InterruptedException
的方法或调用Thread.interrupted
并被编码以响应它时才会被中断。如果您希望能够在任何时候破坏您的线程,您需要将其构建到代码本身中。 Oracle提供tutorial。基本上,您的选择是使用抛出InterruptedExcetion
或sleep
等wait
的方法,定期调用Thread.interrupted
,或者定期检查您自己的停止变量。
无论你如何切片,都必须实现中断。 Java只是有一些简单的方法可以将消息传递给线程。
有Thread.stop
方法,但此方法被视为极其危险。这会停止线程并立即释放所有锁,这可能会使对象处于不可用状态。使用它通常只是一个坏主意。
(对不起,对答案进行了重大修改。)
答案 1 :(得分:3)
引自 Java Tutorials (强调我的):
“中断是一个指示到一个线程,它应该停止正在做的事情......”
“由程序员决定线程如何响应中断......”
“为了使中断机制正常工作,被中断的线程必须支持自己的中断......”
基本上,你必须从线程中观察“Interrupted”标志,并在检测到标志设置时“从内部”终止它。有几种方法可以检查和处理中断(参见上面的链接) - 例如您可以使用Thread
的 interrupted() method
。
我不知道您的读者和转换者的内部运作方式,但while-loop
似乎是实施支票的良好假设:
while (reader.readPacket() == null) {
// code the next packet
...
// Check for interruption
if (Thread.interrupted()) {
// We've been interrupted: terminate
return;
}
}
答案 2 :(得分:2)
有三种终止线程的方法:
- 线程已经完成了它的设计工作,并退出了 自然是run()方法。
- 线程在执行此操作时收到了中断信号 工作。它决定不继续工作并退出运行() 方法。它也可能决定忽略该信号并继续 工作
- 该线程已被标记为守护程序线程。当父线程 谁创建了这个线程终止,这个线程将是有力的 由JVM终止。
醇>
请参阅Sun的这个主题,了解他们为何弃用Thread.stop()。它详细说明了为什么这是一个糟糕的方法以及应该采取什么措施来安全地停止线程。
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
他们推荐的方式是使用共享变量作为标志,要求后台线程停止。然后,该变量可以由请求线程终止的不同对象设置。