Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止拒绝中断的线程?_Java_Multithreading - Fatal编程技术网

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
    也无法工作。换句话说,他们说,”使用中断<代码>线程。停止
    无论如何都不会让你免于挂断。“我同意任何认为该部分措词糟糕的人的看法。这正是我所做的。我使用
    中断()
    检查它是否应该停止。如果是,停止:)我通常说“总是很乐意帮助”,但我想在这种情况下,它更像是”总是很高兴知道如果你没有先自己弄明白我本可以帮你(或类似的事情):在这种情况下:“总是很高兴知道如果接受的答案没有先帮你弄明白我本可以帮你”:D
    EDIT(17/5/2013):当人们回答他们的问题并解决他们的问题,但却从不“接受”答案时,我感到非常沮丧:((我想我会习惯的…
    只是他先来:)