老师,我在您代码最后再加了一个打印thread1的状态,结果打印出waiting

来源:6-5 阻塞的含义

qq_慕圣9338304

2020-01-25

老师,我在您代码最后再加了一个打印thread1的状态,结果打印出waiting,为什么thread1和thread2都是在waiting状态呢?为什么不是一个被blocked,一个在执行run方法里的wait呢?

写回答

4回答

悟空

2020-01-28

都是执行wait();,所以都是waiting状态

0
3
悟空
回复
qq_慕圣9338304
是对的
2020-01-30
共3条回复

qq_慕圣9338304

提问者

2020-01-27

//img.mukewang.com/szimg/5e2ee7b90956763402400170.jpg

这是结果图

0
0

qq_慕圣9338304

提问者

2020-01-27

package threadcoreknowledge.sixstates;

/*
    展示blocked,waiting,timed-waiting三种状态
 */

public class blockedwaitingtimedwaiting implements Runnable{
    public static void main(String[] args) {
        blockedwaitingtimedwaiting runnable=new blockedwaitingtimedwaiting();
        Thread thread1=new Thread(runnable);
        thread1.start();
        Thread thread2=new Thread(runnable);
        thread2.start();
        try{
            Thread.sleep(5);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        //打印出timed-waiting状态,因为正在执行Thread.sleep(1000)
        System.out.println(thread1.getState());
        //打印出blocked状态,因为thread2想拿到syn()的锁却拿不到
        System.out.println(thread2.getState());
        try{
            Thread.sleep(2000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        //打印出waiting状态,由于等了2000ms,在下面run方法中进入了wait(),所以确保是在waiting状态
        System.out.println(thread2.getState());
        System.out.println(thread1.getState());
    }

    @Override
    public void run() {
        syn();
    }

    private synchronized void syn(){
        try{
            Thread.sleep(1000);
            wait();
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}


0
0

悟空

2020-01-27

麻烦你把你的代码贴一下哈,我看了代码才能分析

0
0

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

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

2512 学习 · 939 问题

查看课程