Java 如何停止拒绝中断的线程?
嗯,我的视频转换器中有一个线程,负责对视频进行转码。它是一个Java 如何停止拒绝中断的线程?,java,multithreading,Java,Multithreading,嗯,我的视频转换器中有一个线程,负责对视频进行转码。它是一个用户线程,带有setDaemon(false) 要停止它,我调用threadName.interrupt()方法,但它不会停止。它还在继续 如何阻止它? 以下是我试图阻止它的方法: if(getExecutingTaskID() == taskID){ int what = JOptionPane.showOptionDialog(frame, "Do you want to
用户线程
,带有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;
}
一个线程只能在调用抛出的方法时被中断,或者如果它调用并被编码以响应该方法,则只能被中断。如果您希望能够随时中断线程,则需要将其构建到代码本身中。甲骨文提供了一个。基本上,您可以选择使用抛出
interruptedexception
的方法,如sleep
或wait
,定期调用Thread.interrupted
,或者使用自己的stop变量定期检查
无论如何分割,都必须实现中断。Java只是提供了一些将消息发送到线程的简单方法
有一个线程.stop
方法,但此方法被认为是极其危险的。这会停止线程并立即释放所有锁,这可能会使对象处于不可用状态。使用它通常只是一个坏主意
(很抱歉对答案进行了重大修改。)引用了(我的重点):
“中断是对线程的指示,它应该停止正在执行的操作…”“由程序员决定线程如何准确响应中断……”
“要使中断机制正常工作,被中断的线程必须支持自己的中断…” 本质上,您必须从线程内部观察“Interrupted”标志,并在检测到标志已设置时“从内部”终止它。有几种方法可以检查和处理中断(参见上面的链接)-例如,您可以使用
线程的
我不知道读卡器和转换器的内部工作原理,但是这个while循环似乎是实现检查的好方法:
while (reader.readPacket() == null) {
// code the next packet
...
// Check for interruption
if (Thread.interrupted()) {
// We've been interrupted: terminate
return;
}
}
终止线程有3种方法:
线程已完成其设计要执行的工作,并退出
自然运行()方法
线程在执行其任务时收到了中断信号
工作它决定不继续工作并退出运行()
方法。它也可能决定忽略该信号并继续执行
工作
该线程已标记为守护进程线程。当父线程
创建此线程的人终止,此线程将被强制删除
由JVM终止
请参阅Sun提供的此线程,了解他们为什么不推荐thread.stop()。它详细介绍了为什么这是一个糟糕的方法,以及通常应该做些什么来安全地停止线程
它们重新编译的方式是使用共享变量作为要求后台线程停止的标志。然后,可以通过请求线程终止的其他对象设置此变量。我使用了interrupted()
方法。现在线程检查标志是否已设置,然后停止:)谢谢如果线程没有响应中断,它也不会响应thread。也停止。@assylias建议不是这样,但是如果您测试了,并且它没有按照文档所述工作,那就有点麻烦了。您可以阅读部分“如果线程不响应thread.interrupt怎么办?”例如:应该注意的是,在等待的线程不响应thread.interrupt的所有情况下,它也不会响应thread.stop。不鼓励使用thread.stop
。这是一个很大的禁忌。@assylas下一句说,”此类情况包括故意拒绝服务攻击,以及thread.stop和thread.interrupt无法正常工作的I/O操作。“我认为这意味着,如果某段代码挂起,线程从未进行中断检查,那么thread.stop
也无法工作。换句话说,他们说,”使用中断<代码>线程。停止
无论如何都不会让你免于挂断。“我同意任何认为该部分措词糟糕的人的看法。这正是我所做的。我使用中断()
检查它是否应该停止。如果是,停止:)我通常说“总是很乐意帮助”,但我想在这种情况下,它更像是”总是很高兴知道如果你没有先自己弄明白我本可以帮你(或类似的事情):在这种情况下:“总是很高兴知道如果接受的答案没有先帮你弄明白我本可以帮你”:DEDIT(17/5/2013):当人们回答他们的问题并解决他们的问题,但却从不“接受”答案时,我感到非常沮丧:((我想我会习惯的…
只是他先来:)