notifyAll没有唤醒线程

时间:2016-03-19 16:24:56

标签: java multithreading

我有一个从run()传递线程调用的方法。我创建了一个迭代器来计算传递的线程数,并将其用作wait()

的条件

我有以下代码从线程run()

运行
int intersection(Vector A0, Vector A1, Vector B0, Vector B1)
{
   Vector dA = A1 - A0;
   Vector dB = B1 - B0;
   Vector dC = B0 - A0;

   double s = dot(cross(dC, dB), cross(dA, dB)) / norm2(cross(dA, dB));
    return (s >= 0.0 && s <= 1.0);
}

示例输出:

public void testMethod(Object x) throws InterruptedException {
    synchronized (x) {
        while(threadsWaiting <= 5) {
            threadsWaiting++;
            System.out.println(x.getName() + " waiting " +
                    " | Threads waiting: " + threadsWaiting);
            x.wait();
        }
        x.notifyAll();
        System.out.println(x.getName() + " passed " +
                " | Threads waiting: " + threadsWaiting);
    }
}

正如您所看到的,所有正在等待的线程都没有通过。

这只能按以下方式工作:我传递10个x对象。其中5个去等待(),另外5个打印。打印后,调用x.notifyAll(),但没有更多&#39;完成&#39;打印出来。

调用notifyAll()后,为什么它们处于空闲状态?我知道他们是空闲的,因为即使我打电话给notifyAll()

,也只打印了5次

3 个答案:

答案 0 :(得分:0)

完整的工作示例创建10个线程,等待线程ID超过5。

public class Notify {

    public static void main(String[] args) {
        Object obj = new Object();
        for (int i = 1; i <= 10; i++) {
            Runnable myThread = new MyThread(i, obj);
            new Thread(myThread).start();
        }
    }

    public static class MyThread implements Runnable{

        static final int MAX_THREAD = 5;
        int id;

        Object x;

        public MyThread(int id, Object x) {
            this.id = id;
            this.x = x;
        }

        @Override
        public void run() {
            if(id > MAX_THREAD){
                try {
                    synchronized (x) {
                        x.wait();                       
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //Process something
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Process Thread : " + id);
            synchronized (x) {
                x.notifyAll();              
            }
        }

    }

}

答案 1 :(得分:0)

在所有其他线程调用notifyAll之前,可能会调用wait。如果发生这种情况,那么其他线程将最终在监视器上等待,直到再次得到通知为止。

您应该在java.util.concurrent中查看内容,而不是等待和通知。我从CountDownLatch开始。

答案 2 :(得分:0)

    <input type="text" class="input-style target" style="display: none;" name="input-title" placeholder="TITLE">
<div class="form-group">
  <input type="text" id="inputNote" class="input-style" name="input-note" placeholder="note">
</div>
<div class="btn-action">
  <button class="btn-style target" style="display: none;">CREATE</button>
</div>

while(threadsWaiting <= 5) { threadsWaiting++; System.out.println(x.getName() + " waiting " + " | Threads waiting: " + threadsWaiting); x.wait(); } 是4.我们通过threadsWaiting测试,因此我们进入<= 5循环。我们将while增加到5,然后调用threadsWaiting。但我们正在等待wait为5或更多,而且它已经是。所以我们正在等待已经发生的事情。

等待已经发生的事情是threadsWaiting / notify最常见的误用。