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

来源:7-5 wait解析

大唐雨夜

2020-02-06

上一问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锁
写回答

2回答

悟空

2020-02-06

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

0
0

悟空

2020-02-06

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


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

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

0
3
悟空
回复
小布鲁斯韦恩
获取锁是在wait方法执行期间做的
2020-05-06
共3条回复

线程八大核心+Java并发原理及企业级并发解决方案

完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题

2512 学习 · 939 问题

查看课程