我有一个从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次答案 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
最常见的误用。