当线程被终止(thread.state.terminated
)时,它仍然不会被中断。为什么?
我找到了这个,我找到了这个,但都没有回答我的问题。我在OpenJDK 11和Oracle JDK 16上试用过这个方法--没有区别,结果一样。
我现在已经用Java工作了10多年,多线程任务对我来说一直很清楚;然而,意外地,我遇到了一些奇怪的事情(对我来说),这让我感到奇怪。
我理解,私有volatile boolean interrupted;
只是类thread
的一个标志(字段),我可以将它与interrupt()
结合使用,以便在isinterrupt()
获得true
的情况下编写一些逻辑。
但是,为什么thread.state.terminated
状态不会使同一线程也被interrupt
中断?
java prettyprint-override">public class MainClass {
public static void main(String[] args) throws Exception {
Thread alfa = new Thread(() -> {
for (int i = 0; i < 3; i++) {
System.out.println(i + ". " + Thread.currentThread().getName() + " state: " + Thread.currentThread().getState().name());
try {Thread.sleep(1000);} catch (Exception e) {}
}
});
alfa.setName("Alfa thread");
System.out.println(alfa.getName() + " state before invoking .start() is: " + alfa.getState().name());
alfa.start();
int i = 0;
while (true) {
++i;
System.out.println(i + ". " + alfa.getName() + " state: " + alfa.getState().name());
System.out.println(i + ". " + alfa.getName() + " is interrupted?: " + alfa.isInterrupted());
Thread.sleep(1000);
}
}
}
演示了以下内容:
Alfa thread state before invoking .start() is: NEW
1. Alfa thread state: RUNNABLE
0. Alfa thread state: RUNNABLE
1. Alfa thread is interrupted?: false
1. Alfa thread state: RUNNABLE
2. Alfa thread state: TIMED_WAITING
2. Alfa thread is interrupted?: false
2. Alfa thread state: RUNNABLE
3. Alfa thread state: TIMED_WAITING
3. Alfa thread is interrupted?: false
4. Alfa thread state: TERMINATED //alfa is terminated!
4. Alfa thread is interrupted?: false //alfa is not interrupted. Seriously?
terminated
的thread.state
表示指定的thread
已完成执行。终止的thread
不会被中断,您可能会将这两件事情混合在一起,这是不同的。
只有当线程通过interrupt()
方法被另一个线程中断时,IsInterrupt()
方法才返回true。
看看这里:https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html
线程终止并不意味着线程中断,因为它们是两个不同的、独立的东西。
问题内容: 在装有NVidia GeForce 820M的Windows 10 PC上,我成功安装了CUDA 9.2和cudnn 7.1,然后按照pytorch.org上的说明安装了PyTorch。 具体来说我使用了命令 因为我使用点子而不是Anaconda。 然而我得到以下 为什么会这样呢? 问题答案: 您的图形卡不支持CUDA 9.0。 由于我已经看到很多涉及此类问题的问题,因此我就如何检查您
问题内容: 即使正则表达式应返回true,程序也不会退出。代码有什么问题? 问题答案: 仅当整个字符串与正则表达式匹配时才返回。在你的情况下,你的正则表达式仅代表 一个 字符不是,或。 我怀疑您要检查字符串是否包含您在正则表达式中描述的这些特殊字符之一。在这种情况下,请将您的正则表达式括起来,以使正则表达式匹配整个字符串。哦,您不必逃脱character class内部。
问题内容: 考虑一下这个功能: 有人可以解释一下为什么L1和L2显然无法到达时没有给出警告,而L3却给出了警告。 问题答案: 因为就编译器而言,这只是另一个方法调用。 它所做的是结束过程这一事实只能从实现中找到(这是本机代码,而没有任何区别)。 如果你必须把你的代码(通常也最好避免它,除非你想返回0以外的代码),它应该是一个方法,返回,例如。这样更好。 关于可达性,解释是相同的:是Java语言的关
问题内容: 作为标题。 捕获“ InterruptedException”后,为什么“ Thread.currentThread()。isInterrupted()”的值为false? 问题答案: 在Javadoc中(由调用): InterruptedException-如果任何线程中断了当前线程。引发此异常时,将清除当前线程的中断状态。 我认为的目的是让您 在 调用可能引发的事件 之前 检测线程
问题内容: 我正在尝试用写入文件后删除文件。这是我用来编写的代码: 我刷新并关闭了流,但是当我尝试删除时,返回。 我删除前检查,看看是否该文件存在,并且:,,一切回归真实。在调用这些方法之后,我尝试返回。 我做错了什么吗? 问题答案: 起作用的把戏很奇怪。事情是,当我以前读取文件的内容时,我使用。阅读后,我关闭了缓冲区。 同时,我切换了语言,现在我正在使用读取内容。同样在完成阅读后,我关闭了流。现
我用了这个JPA:检查一个实体对象是否被持久化或不知道我是否持久化或合并我的实体,它看起来像这样: 情况是,即使我编辑了我的实体,它也不会被识别为合并。 这是如何可能的,以及如何使其发挥作用?