0
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 ");
            }
        }
    }
}

我只是在这里感到困惑,为什么t2.interrupt()当 t2 正在等待获取资源对象的锁定时不抛出异常,并且interrupt()方法可能会抛出安全异常,那么为什么编译器仍然允许我们执行它而不将其放入 try catch 块中。

4

4 回答 4

2

同步块不会抛出 InterruptedException 并且在尝试以这种方式获取监视器时中断线程阻塞不会做任何事情。

如果你想要这个功能,你需要使用具有lockInterruptibly()的 Lock ,尽管这并不经常使用。

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

如果当前线程已经持有这个锁,那么持有计数加一并且方法立即返回。

如果锁被另一个线程持有,则当前线程将被禁用以用于线程调度目的并处于休眠状态,直到发生以下两种情况之一:

锁被当前线程获取;或其他一些线程中断当前线程。如果当前线程获取了锁,则锁持有计数设置为 1。

如果当前线程: 在进入此方法时设置了其中断状态;或者在获取锁的过程中被中断,则抛出InterruptedException,清除当前线程的中断状态。

于 2013-08-01T05:27:39.587 回答
1

Thread#interrupt()

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

如果您选中t2.interrupted(),您会看到一个true结果,但是线程在进入synchronized块时被阻塞,这不会触发InterruptedException.

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

于 2013-08-01T05:26:33.160 回答
1

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

syncrhonized响应中断。

为此,您可以使用显式锁Lock,它具有lockInterruptibly()响应中断的方法。

锁定接口中的 lockInterruptibly()

于 2013-08-01T05:27:41.350 回答
0

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

除非当前线程正在中断自己,这总是允许的,否则会调用该线程的checkAccess方法,这可能会导致抛出SecurityException 。

如果该线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法或 join()、join(long)、join(long, int) 时被阻塞, sleep(long), or sleep(long, int), 这个类的方法,那么它的中断状态将被清除,它会收到一个InterruptedException

您在 t2 上调用了 sleep()。这就是出现interruptedException的原因。

于 2013-08-01T05:50:43.313 回答