关于Java的InterruptedException有一些有趣的问题和答案,例如Java中的InterruptedException
的原因和处理InterruptedException。但是,它们都没有告诉我InterruptedException的可能来源。
像SIGTERM,SIGQUIT,SIGINT这样的OS信号呢?在命令行上按CTRL-C是否会产生InterruptedException?还有什么?
您列出的所有内容都不会产生InterruptedException
。
唯一可以中断线程的是对的调用Thread#interrupt()
。JLS在此问题上相对清晰,从第17.2.3节开始:
17.2.3中断
调用时会发生中断操作
Thread.interrupt
,以及为依次调用而定义的方法ThreadGroup.interrupt
。
有关更多信息,请参见有关中断的官方教程。特别:
线程通过调用要中断的线程
interrupt
的Thread
对象来发送中断。为了使中断机制正常工作,被中断的线程必须支持自己的中断。…
中断机制是使用内部标志(称为 中断状态)实现的
。调用Thread.interrupt
设置此标志。当线程通过调用static方法检查中断时,将Thread.interrupted
清除中断状态。isInterrupted
一个线程用于查询另一线程的中断状态的非静态方法不会更改中断状态标志。按照惯例,任何通过抛出
InterruptedException
清除中断状态而退出的方法都会这样做。但是,总是有可能通过另一个线程调用再次立即设置中断状态interrupt
。
含义是,它是仅可以通过调用设置的显式标志interrupt()
,而不是由其他未知外部事件触发的。在抛出异常的各种方法中对异常的描述进一步暗示了这一点,例如(强调我的):
InterruptedException
- 如果有任何线程中断了当前线程 。引发此异常时,将清除当前线程的中断状态。
通常,中断系统的目的是提供一个通用的,定义明确的框架,以允许线程中断其他线程中的任务(可能是耗时的任务)。尽管您可以在自己的应用程序中使用显式逻辑来实现类似的功能,但是具有这种定义良好的机制允许独立的类(例如,JDK,其他第三方代码,您自己的代码中的其他独立的类)以一致的方式提供此功能。
。
许多注意事项和“警告”你看到的关于处理InterruptedException
并不意味着暗示,他们可以完全自发地抛出,他们是为了鼓励精心设计的对象,可以在那些还不知道上下文,这里使用interrupt()
将被推定工作(所以真的,你
也 不想承担他们可以自发如果要创建可重用的对象,这将是稳健的未来的情况下被抛出-即你永远保证你的代码不会有一天被人谁希望使用中断工作)。
为了快速一次性项目你不 真正
需要担心这些例外,只要你肯定知道你是不是要求特殊处理interrupt()
,而不是调用的东西,可以打电话interrupt()
,但要注意的含义从长远来看,尤其是如果您最终在其他上下文中重用该代码时。
问题内容: java和slf4j的一些问题使用想法制作项目,可以。但是如果我尝试用gradle制作罐子,我会遇到一些问题。 build.gradle Test.java 终奌站: 输出: 我试图使用gradle / maven(mvn包)相同的问题。由于某些原因,它无法在类路径中找到Logger和LoggerFactory。 问题答案: 谢谢迈克尔记得关于胖子的事。在您的评论尝试谷歌搜索后:“ g
问题内容: 当我尝试运行程序时,出现以下错误 请帮忙 问题答案: 从Javadoc: 如果Java虚拟机找不到声明为native的方法的适当本机语言定义,则抛出该异常。 这是与JNI相关的错误。loadJacobLibrary试图加载名为jacob-1.14.3-x86的本机库,但在java.library.path定义的路径上找不到该库。启动JVM时,应将此路径定义为系统属性。例如 在Windo
在这里抛出RejectedExecutionException是否有其他原因? java.util.concurrent.RejectedExecutionException:任务java.util.concurrent.FutureTask@4194a5f0被java.util.concurrent.ThreadPoolExecutor@41a36e90拒绝[终止,池大小=0,活动线程=0,排队
我有一个使用activeMQ消息的项目。它运行良好,但有时会遇到挂起的消息卡在队列中。它说1000入队,0出队,1000分派。它还说1000条待处理的消息。 “待定消息”的可能原因是什么?
问题内容: 在关于sqlite的android vogella教程期间,我遇到了令人讨厌的问题,并出现以下错误: 我无数次地一步步修改所有文件,以正确重新创建R. class。关于此错误的非常奇怪的是,我不知道为什么在“ com.example.de.vogella.android”中有关于“ com.example”的任何内容。这是某种标准生成的名称吗?我所有的包/名称/路径都从未以“ com.
问题内容: 与Cipher合作时,我观察到以下内容。 加密码: 解密代码: 运行Decrypt代码时,出现IllegalBlockSizeException(输入长度必须为16的倍数)。 但是如果我将解密代码更改为 它工作正常。我知道这是有规律的。所以我以为是因为我没有提到填充。所以我尝试在加密过程中提供模式和填充, 加密码: 解密代码: 但是它失败,并带有IllegalBlockSizeEx