请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

接上一问,线程WAITING状态被其他线程请求中断

上一问https://coding.imooc.com/learn/questiondetail/146107.html
上一问中老师说“必须要等到被唤醒后,并且拿到锁之后才能响应中断的,wait期间什么都做不了”。我下面的代码为什么可以响应中断。

public class WaitingStatusToInterrupt {
    private static Object resourceA = new Object();

    static class Thread1 extends Thread {
        @Override
        public void run() {
            synchronized (resourceA) {
                System.out.println(Thread.currentThread().getName() + "--获取到resourceA锁");
                try {
                    System.out.println(Thread.currentThread().getName() + "--释放resourceA锁");
                    resourceA.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "--再次获取到resourceA锁");
            }
        }
    }

    static class Thread2 extends Thread {
        @Override
        public void run() {
            synchronized (resourceA) {
                System.out.println(Thread.currentThread().getName() + "--获取到resourceA锁");
                resourceA.notify();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread1 thread1 = new Thread1();
        thread1.start();
        Thread.sleep(1000);
        System.out.println("----------------------");
        System.out.println(thread1.getName() + "--" + thread1.getState());
        thread1.interrupt();
        Thread.sleep(1000);
        System.out.println("----------------------");
        Thread2 thread2 = new Thread2();
        thread2.start();
        Thread.sleep(1000);
    }

运行结果:

Thread-0--获取到resourceA锁
Thread-0--释放resourceA锁
java.lang.InterruptedException
----------------------
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:502)
Thread-0--WAITING
	at com.lzp.java.concurrent.threadcore.threadandobject.object.WaitingStatusToInterrupt$Thread1.run(WaitingStatusToInterrupt.java:17)
Thread-0--再次获取到resourceA锁
----------------------
Thread-1--获取到resourceA锁

正在回答 回答被采纳积分+3

2回答

悟空 2020-02-06 15:49:34

notify/notifyAll是一种唤醒,中断也是一种唤醒

0 回复 有任何疑惑可以回复我~
悟空 2020-02-06 11:20:45

能响应中断是因为已经获取到了锁。


你代码里“System.out.println(Thread.currentThread().getName() + "--再次获取到resourceA锁");”

这个位置是不对的,只要是从wait方法出来了,就代表了再次获取到了锁,所以这行打印可以放在catch里面的第一行

0 回复 有任何疑惑可以回复我~
  • 老师 我发现这行再次获得锁放到catch或者放在try/catch外都是会被执行的,是不是线程thread0要响应中断就要获取锁,而当前并没有其他线程持有锁,刚好能拿到锁来响应,那么也就是说在wait情况下也会有获取锁的动作,并非什么也做不了
    回复 有任何疑惑可以回复我~ 2020-05-05 21:01:14
  • 休眠期间,无法获取锁,被唤醒后,可以开始获取锁,当获取到锁,wait方法返回。
    回复 有任何疑惑可以回复我~ 2020-05-06 14:50:32
  • 获取锁是在wait方法执行期间做的
    回复 有任何疑惑可以回复我~ 2020-05-06 14:50:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信