请稍等 ...
×

采纳答案成功!

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

为什么第二次打印t2的状态会输出TIMED_WAITING ?不应该还是BLOCKED吗,t1还没释放锁啊?

public class BlockedWaitingTimeWaiting implements Runnable {

public static void main(String[] args) throws InterruptedException {
    BlockedWaitingTimeWaiting runnable = new BlockedWaitingTimeWaiting();
    Thread t1 = new Thread(runnable);
    t1.start();
    Thread t2 = new Thread(runnable);
    t2.start();
    Thread.sleep(5);
    System.out.println(t1.getState());  //TIMED_WAITING : t1正在 Thread.sleep(1000)
    System.out.println(t2.getState());  //t2正在  syn() 阻塞,拿不到t1正持有的锁
    Thread.sleep(1300);
    System.out.println(t1.getState());  //WAITING
    System.out.println(t2.getState());  //这里输出的是TIMED_WAITING???
}

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

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

}

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

插入代码

2回答

悟空 2020-01-30 17:31:17

是的,其他同学已经回答了

1 回复 有任何疑惑可以回复我~
  • 悟空老师, 这道题我有点疑惑。 我按照提问同学的代码运行了一下,确实最后打印t2的状态是TIMED_WAITING。我的理解是此时t2正在执行syn()中的Thread.sleep(1000),还未休眠结束。 而提问同学问t2"不应该还是BLOCKED吗,t1还没释放锁啊?",是因为t1正在执行的wait()方法会释放锁资源,从而t2可以拿到锁。  不知道上述的理解是否有偏差,麻烦老师帮忙check一下。
    回复 有任何疑惑可以回复我~ 2020-03-30 09:46:57
  • 悟空 回复 MarcoLiLiLi #2
    t1正在执行的wait()方法会释放锁资源,从而t2可以拿到锁,正在sleep,所以是TIMED_WAITING
    回复 有任何疑惑可以回复我~ 2020-03-30 10:42:20
慕粉6188528 2020-01-30 16:33:53

都是执行wait();,后面两个都应该为waiting状态

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号