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