在mulitiple等待线程之间通知后,哪个线程将开始运行

时间:2017-12-14 03:21:30

标签: java multithreading wait notify

我正在努力了解notify& notifyAll不同。

让我们考虑一下线程t1正在使用资源R的情况。现在两个线程t2& t3正在等待相同的资源。如果t1notify上调用R方法,t2& t3会开始吗?如果t1notifyAll上调用R方法,t2t3我们会通知IEnumerator,但由于他们仍在竞争同一资源,因此其中只有一人应该可以启动。哪一个能够这样做?

2 个答案:

答案 0 :(得分:0)

你猜不出哪一个确切地开始起作用。 Java Docs说这是任意选择。

答案 1 :(得分:0)

Object.notify()将选择一个随机等待线程并通知锁定    释放后,它可以继续为自己获得锁定。    Object.notifyAll()将通知正在等待锁定的所有线程    那个对象和他们竞争获得锁定。

最初我们可能会想,如果我为每个线程设置不同的优先级,那么我    可以控制序列。但事实并非如此,优先事项并不能保证    优先级较高的线程将运行。

但是如果你真的想控制线程执行的使用顺序    线程同步器。

测试线程选择中的优先级很少:

public class NotifyVSNotifyAll {


    public static void main(String[] args) {

        Object resource = new Object();

        Thread a=new Thread(()->{
                                   synchronized (resource) {
                                       System.out.println("A");
                                       try{
                                          Thread.sleep(2000);
                                          resource.notify();
                                      //resource.notifyAll();
                                       }catch(Exception E){}
                                   }  

                                 });
        Thread b=new Thread(()->{
            synchronized (resource) {
               System.out.println("B");
               }  

          });
        Thread c=new Thread(()->{
            synchronized (resource) {
               System.out.println("C");
               }  

          });

        a.setPriority(10);
        b.setPriority(1);
        c.setPriority(10);

        a.start();
        c.start();
        b.start();

    }


}

Hope its clear.