如何在java中消除挂线
我一直在试图杀死线程挂起由于沉重的IO操作。 我本可以尝试如何在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
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();