由于某些原因,当迭代线程列表并中断所有线程时,没有一个线程使用InterruptedException执行catch块。
在以下存储库中:https://github.com/ranisalt/LiuThread
我有两个线程,每个线程都有执行器服务,其中一个包含读取器,另一个是读取器。写信人应该每100毫秒生成一次,写到缓冲区,退出/停止/任何只是不写的东西。阅读器是试图阅读的4个线程,如果可以的话,它们也应该退出,所以有空间给另一个读者。
我有100个人(读者和作家),如果他们不能读或写,他们等待60秒。
然后,我有一个协调线程,它一直在测试缓冲区是空的(并中断编写器)还是完整的(中断读取器),所以它们永远不应该等待60年代。缓冲区知道它的状态。
问题是,出于某种原因,这个片段:
for (ThreadAzul azul : threadsAzuis) {
azul.interrupt();
}不会打断线程!我用println看是否被打断了:
try {
sleep(60000);
System.out.println(this.getName() + " foi dormir");
} catch (InterruptedException e) {
System.out.println(this.getName() + " foi interrompido");
}但这个从来没有写过。中断()不执行catch块的原因是什么?
发布于 2014-05-07 12:36:05
在main方法中,您要在Thread上调用run(),这样就不会启动新的Thread,而是在初始的main线程中运行它的代码。因此,在从未启动的interrupt实例上调用Thread不会中断实际上正在执行代码的main线程。
当您将submit Thread实例复制到Executor时,也会重复相同的错误。执行器将执行Thread实例的Thread方法,因为Thread实现了Runnable,但是Executor将在自己的托管Thread中执行,而不是在您创建但从未启动的实例所表示的Thread中执行。
因此,在从未启动的interrupt实例上调用Thread不会中断实际执行代码的线程。
通常,您应该而不是混合使用、Thread和Executor。选择一种方法,手动处理Thread或使用ExecutorSevice。
当您使用Thread的时候,您必须使用start()方法来启动它们,而不是调用run()方法。
发布于 2014-05-07 11:20:57
线程只在可中断操作期间被中断,例如Thread.sleep(), Thread.wait(),和一些I/O调用(并非全部)。
发布于 2017-01-25 18:20:09
设置中断标志,不中断线程。线程在检查时就会结束,如果它应该结束的话。因此,只要给线程一个检查isInterrupted()的机会,或者在它睡觉或等待时中断它。如果在run()中有一个长期的方法,中断()将无法工作。你必须执行定期检查或其他解决办法。
https://stackoverflow.com/questions/23516213
复制相似问题