Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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,我一直在试图杀死线程挂起由于沉重的IO操作。 我本可以尝试thread.destroy或thread.stop,但它们已被弃用 例如,看看下面的代码 public class ThreadCheck { private static int cnt = 0; public static void main(String args[]) throws InterruptedException, ExecutionException { Thread t1 = new Thread(new

我一直在试图杀死线程挂起由于沉重的IO操作。 我本可以尝试
thread.destroy
thread.stop
,但它们已被弃用 例如,看看下面的代码

public class ThreadCheck {
private static int cnt = 0;
public static void main(String args[]) throws InterruptedException, ExecutionException {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Running tasks");
          while (condition)                             {
                // **** Some IO operation that take forever ****                
                System.out.println("iteration " + cnt++);
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("Breaking loop");
                    return;
                }   
            }           
        }
    });
    t1.start();
    TimeUnit.SECONDS.sleep(5);
    t1.interrupt();
    System.out.println("thread destroyed..");

  }
}

问题是我添加了
中断
调用,但它从未完成IO调用,所以在这种情况下,我可以杀死线程吗

如何停止等待很长时间(例如等待输入)的线程?

这就是Thread.interrupt方法的用途。同样的“以国家为基础” 可以使用上面所示的信令机制,但状态会发生变化 (在上一个示例中,blinker=null)后面可以跟一个调用 Thread.interrupt,中断等待:

要使这项技术发挥作用,关键是任何方法 中断异常,不准备立即处理 重新声明异常。我们说的是重申,而不是重复, 因为不可能总是重新显示异常。如果 捕获InterruptedException的方法未声明为抛出 这个(选中的)异常,然后它应该使用 以下咒语:

这将确保线程将重新释放InterruptedException 只要有可能

如果线程没有响应线程,该怎么办?中断?

在某些情况下,您可以使用特定于应用程序的技巧。例如 如果一个线程正在等待一个已知的套接字,您可以关闭该套接字以访问它 使线程立即返回。不幸的是,真的有 没有任何技术可以在一般情况下起作用。应该指出的是 等待线程不响应的所有情况 Thread.interrupt,它也不会响应Thread.stop。这样的 案例包括故意拒绝服务攻击和I/O操作 对于哪个线程,thread.stop和thread.interrupt不能正常工作


这取决于具体的IO操作。例如,如果您可以将代码更改为使用
InteroptibleChannel
,您将能够实现所需的功能。不管怎么说,IO操作对这件事负责至关重要。是的,他说的@Real怀疑论者我正在读取一些CSV文件并将它们中的数据插入数据库,但有时这些CSV文件会损坏,IO调用永远不会结束,在这种情况下,java是否有任何实现可以像在unix kill Commander中那样杀死线程,或者使用
ExecutorService
并为您的方法创建超时。@Nomad:是,Thread类有一个
stop()
方法,可以在中找到。但您也会在API中看到,您永远不应该使用这种方法,以及为什么。同样,解决方案如上所述。
public void stop() {
    Thread moribund = waiter;
    waiter = null;
    moribund.interrupt();
}
Thread.currentThread().interrupt();