首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程中断()不中断线程

线程中断()不中断线程
EN

Stack Overflow用户
提问于 2014-05-07 11:11:14
回答 3查看 1.4K关注 0票数 0

由于某些原因,当迭代线程列表并中断所有线程时,没有一个线程使用InterruptedException执行catch块。

在以下存储库中:https://github.com/ranisalt/LiuThread

我有两个线程,每个线程都有执行器服务,其中一个包含读取器,另一个是读取器。写信人应该每100毫秒生成一次,写到缓冲区,退出/停止/任何只是不写的东西。阅读器是试图阅读的4个线程,如果可以的话,它们也应该退出,所以有空间给另一个读者。

我有100个人(读者和作家),如果他们不能读或写,他们等待60秒。

然后,我有一个协调线程,它一直在测试缓冲区是空的(并中断编写器)还是完整的(中断读取器),所以它们永远不应该等待60年代。缓冲区知道它的状态。

问题是,出于某种原因,这个片段:

代码语言:javascript
复制
for (ThreadAzul azul : threadsAzuis) {
    azul.interrupt();
}

不会打断线程!我用println看是否被打断了:

代码语言:javascript
复制
try {
    sleep(60000);
    System.out.println(this.getName() + " foi dormir");
} catch (InterruptedException e) {
    System.out.println(this.getName() + " foi interrompido");
}

但这个从来没有写过。中断()不执行catch块的原因是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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不会中断实际执行代码的线程。

通常,您应该而不是混合使用ThreadExecutor。选择一种方法,手动处理Thread或使用ExecutorSevice

当您使用Thread的时候,您必须使用start()方法来启动它们,而不是调用run()方法。

票数 4
EN

Stack Overflow用户

发布于 2014-05-07 11:20:57

线程只在可中断操作期间被中断,例如Thread.sleep(), Thread.wait(),和一些I/O调用(并非全部)。

票数 1
EN

Stack Overflow用户

发布于 2017-01-25 18:20:09

设置中断标志,不中断线程。线程在检查时就会结束,如果它应该结束的话。因此,只要给线程一个检查isInterrupted()的机会,或者在它睡觉或等待时中断它。如果在run()中有一个长期的方法,中断()将无法工作。你必须执行定期检查或其他解决办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23516213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档