加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 为什么下面的程序,没有睡眠会进入死锁状态,但是在睡眠状

发布时间:2020-12-15 04:28:40 所属栏目:Java 来源:网络整理
导读:public class ThreadTest {public static void main(String[] args) throws InterruptedException { ExampleTest obj = new ExampleTest(); Thread t1 = new Thread(new Runn(obj)); Thread t2 = new Thread(new Runn(obj)); Thread t3 = new Thread(new Run
public class ThreadTest {
public static void main(String[] args) throws InterruptedException {
    ExampleTest obj = new ExampleTest();
    Thread t1 = new Thread(new Runn(obj));
    Thread t2 = new Thread(new Runn(obj));
    Thread t3 = new Thread(new Runn(obj));
    t1.start();
    t2.start();
    t3.start();

    //Thread.sleep(1);

    obj.exit();

}

}

class ExampleTest {
public synchronized void enter() {
    try {
        System.out.println("printed " +Thread.currentThread().getName() +" inside wait");
        this.wait();
        System.out.println("printed " +Thread.currentThread().getName() +" exit wait");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("printed " +Thread.currentThread().getName() +" at time: "+System.currentTimeMillis());
}

public synchronized void exit() {
    this.notifyAll();
}

}

class Runn implements Runnable {
ExampleTest obj;

public Runn(ExampleTest obj) {
    this.obj = obj;
}

@Override
public void run() {
    obj.enter();
}

}

what is the role of notifyAll(). Will notifyAll() allows all the waiting thread to acquire lock sequentially in random order or only one thread can acquire the lock?

解决方法

没有sleep语句的语句obj.exit();很可能在所有线程都达到等待状态之前执行.即.在至少有一个线程处于等待状态之前,notifyAll调用将结束.因此,至少有一个线程将处于等待状态,等待其他线程通知它并唤醒.但是,因为obj.exit()已经完成,所以永远不会发生这种情况.

在你的睡眠声明到位后,你的所有线程都有机会达到他们的等待状态,睡眠后你的notifyAll调用会将它们全部唤醒.唤醒的顺序不是确定性的,并且将由线程调度程序处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读