采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,我在您代码最后再加了一个打印thread1的状态,结果打印出waiting,为什么thread1和thread2都是在waiting状态呢?为什么不是一个被blocked,一个在执行run方法里的wait呢?
都是执行wait();,所以都是waiting状态
非常感谢!
是不是由于线程1 sleep了1000ms然后进入了wait(),所以释放了锁,然后线程2拿到了锁并且在1000ms后也wait(),由于没有人去notify它们,所以他们就一直保持wait状态,所以打印出来时就是两个都在waiting?
是对的
这是结果图
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(); } } }
麻烦你把你的代码贴一下哈,我看了代码才能分析
登录后可查看更多问答,登录/注册
完整的并发知识网络+丰富的工作内容分享+50余道并发高频面试题
1.9k 26
888 12
1.0k 12
2.5k 12
1.1k 11