Java 为什么在这里抛出中断异常…原因?

Java 为什么在这里抛出中断异常…原因?,java,multithreading,interrupted-exception,Java,Multithreading,Interrupted Exception,我在这里感到困惑,为什么当t2等待获取资源对象上的锁时,t2.interrupt()没有引发异常,interrupt()方法可能引发安全异常,那么为什么编译器仍然允许我们在不将其放入try-catch块的情况下执行它。来自: 如果前面的条件都不成立,那么将设置该线程的中断状态 如果选中t2.interrupted(),则会看到true结果,但线程在进入synchronized块时阻塞,该块不会触发中断异常 如果应用程序的环境设置了线程可以与其他线程交互的限制,则调用interrupt()可能会引

我在这里感到困惑,为什么当t2等待获取资源对象上的锁时,
t2.interrupt()
没有引发异常,
interrupt()
方法可能引发安全异常,那么为什么编译器仍然允许我们在不将其放入try-catch块的情况下执行它。

来自:

如果前面的条件都不成立,那么将设置该线程的中断状态

如果选中
t2.interrupted()
,则会看到
true
结果,但线程在进入
synchronized
块时阻塞,该块不会触发
中断异常

如果应用程序的环境设置了线程可以与其他线程交互的限制,则调用
interrupt()
可能会引发
SecurityException
,但这不适用于您的简单示例。

来自:

如果前面的条件都不成立,那么将设置该线程的中断状态

如果选中
t2.interrupted()
,则会看到
true
结果,但线程在进入
synchronized
块时阻塞,该块不会触发
中断异常


如果应用程序的环境设置了线程可以与其他线程交互的限制,则调用
interrupt()
可能会引发
SecurityException
,但这不适用于您的简单示例。

同步块不会引发InterruptedException,并且在尝试以这种方式获取监视器时中断线程阻塞不会起任何作用

如果你想要这个功能,你需要使用一个锁,虽然这不是经常使用

获取锁,除非当前线程被中断。获得 如果锁没有被另一个线程持有并立即返回, 将锁定保持计数设置为1

如果当前线程已经持有该锁,则持有计数为 递增1,该方法立即返回

如果锁由另一个线程持有,则当前线程变为 出于线程调度目的而禁用,并处于休眠状态,直到 发生了两件事:

锁被当前线程获取;或者其他的线 中断当前线程。如果锁是由当前用户获取的 线程,则锁定保持计数设置为1

如果当前线程: 在进入该方法时设置其中断状态;或者是 在获取锁时被中断,然后中断Exception 抛出,当前线程的中断状态被清除


同步块不会抛出InterruptedException,并且在尝试获取监视器时中断线程阻塞,但这种方式没有任何作用

如果你想要这个功能,你需要使用一个锁,虽然这不是经常使用

获取锁,除非当前线程被中断。获得 如果锁没有被另一个线程持有并立即返回, 将锁定保持计数设置为1

如果当前线程已经持有该锁,则持有计数为 递增1,该方法立即返回

如果锁由另一个线程持有,则当前线程变为 出于线程调度目的而禁用,并处于休眠状态,直到 发生了两件事:

锁被当前线程获取;或者其他的线 中断当前线程。如果锁是由当前用户获取的 线程,则锁定保持计数设置为1

如果当前线程: 在进入该方法时设置其中断状态;或者是 在获取锁时被中断,然后中断Exception 抛出,当前线程的中断状态被清除


这个问题不清楚,但我想我理解正确,所以我试图回答

syncrhonized
块对中断不响应

为此,您可以使用显式锁
Lock
,它有一个响应中断的方法
lockinterruptbly()


这个问题不清楚,但我想我理解正确,所以我正在尝试回答

syncrhonized
块对中断不响应

为此,您可以使用显式锁
Lock
,它有一个响应中断的方法
lockinterruptbly()


java.lang.Thread.interrupt()表示中断此线程

除非当前线程中断自身(这是始终允许的),否则会调用此线程的checkAccess方法,这可能会导致抛出SecurityException

如果此线程在调用对象类的wait()、wait(long)或wait(long,int)方法时被阻塞,或者在调用此类的join()、join(long)、join(long,int)、sleep(long)或sleep(long,int)方法时被阻塞,那么它的中断状态将被清除,并且它将收到一个中断异常


您已经在t2上调用了sleep()。这就是得到interruptedException的原因

java.lang.Thread.interrupt()表示中断此线程

除非当前线程中断自身(这是始终允许的),否则会调用此线程的checkAccess方法,这可能会导致抛出SecurityException

如果此线程在调用对象类的wait()、wait(long)或wait(long,int)方法时被阻塞,或者在调用此类的join()、join(long)、join(long,int)、sleep(long)或sleep(long,int)方法时被阻塞,那么它的中断状态将被清除,并且它将收到一个中断异常

public class TwoThreads {
    private static Object resource = new Object();

    private static void delay(long n) {
        try 
        { 
            Thread.sleep(n);
        }
        catch (Exception e)
        { 

            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.print("StartMain ");
        new Thread1().start();
        delay(1000);                       //dealay 1
        Thread t2 = new Thread2();
        t2.start();   
        delay(1000);                      // delay 2    
        t2.interrupt();                   //here its throwing exception
        delay(1000);                      //delay 3
        System.out.print("EndMain ");
    }

    static class Thread1 extends Thread {
        public void run() {
            synchronized (resource) {
                System.out.print("Startl ");
                delay(6000);
                System.out.print("End1 ");
            }
        }
    }

    static class Thread2 extends Thread {
        public void run() {
            synchronized (resource) {
                System.out.print("Start2 ");
                delay(2000);
                System.out.print("End2 ");
            }
        }
    }
}