Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么被打断和被打断的行为方式不同?_Java_Multithreading - Fatal编程技术网

Java 为什么被打断和被打断的行为方式不同?

Java 为什么被打断和被打断的行为方式不同?,java,multithreading,Java,Multithreading,我刚刚经历过。我确实了解了Thread类的两个方法之间的区别:interrupted()和isInterrupted()。引用该文件: 当线程通过调用静态方法检查中断时 Thread.interrupted,中断状态被清除。非静态 isInterrupted方法,由一个线程用于查询 另一个的中断状态,不改变中断状态 旗帜 我不明白的是,为什么这种行为一直如此? 是否有任何原因导致interrupted重置当前线程的状态,而isInterrupted没有调用它的线程的状态?线程。interrupt

我刚刚经历过。我确实了解了Thread类的两个方法之间的区别:interrupted()和isInterrupted()。引用该文件:

当线程通过调用静态方法检查中断时 Thread.interrupted,中断状态被清除。非静态 isInterrupted方法,由一个线程用于查询 另一个的中断状态,不改变中断状态 旗帜

我不明白的是,为什么这种行为一直如此?
是否有任何原因导致
interrupted
重置当前线程的状态,而
isInterrupted
没有调用它的线程的状态?

线程。interrupted
仅适用于当前线程;这是一种静态方法

new Thread(() -> {
    while (true) {
        if (Thread.interrupted()) {
            break;
        }
        System.out.println("Running");
    }
});
清除标志很方便,因为执行检查的线程预期会对中断做出反应并以某种方式处理它。如果要再次重置标志,很简单:只需调用
中断


isInterrupted
不是静态方法。它被设计成可能被其他线程调用

Thread foo = new Thread(/*...*/);
foo.start();

//...

if (foo.isInterrupted()) 
{
   //do something
}
首先,其他线程在概念上不能告诉
foo
它不再被中断
foo
必须自己处理中断-其他线程不能代表
foo
处理中断


从实现的角度来看,如果此方法要自动清除标志,那么必须将此检查设置为原子,以避免线程
foo
在重置标志之前读取标志。您必须以某种方式与线程本身共享这个互斥锁。这将使
isInterrupted
方法难以使用。

如果要检查线程是否已中断,请调用
thread.isInterrupted()

当您要检查当前线程是否中断时,如果是,您将处理并吞下它,请调用
thread.interrupted()