Java 多线程通信为什么使用wait和notify不能保证输出 我期望以71001000乘法器的序列输出,有时显示,但有时不显示。我不明白等待和通知的用法出了什么问题。 T3(目标y){ 这个。t=y; } 公开募捐{ 对于(int i=0;i
我认为我正确地使用了标志,但我想知道出了什么问题。Java 多线程通信为什么使用wait和notify不能保证输出 我期望以71001000乘法器的序列输出,有时显示,但有时不显示。我不明白等待和通知的用法出了什么问题。 T3(目标y){ 这个。t=y; } 公开募捐{ 对于(int i=0;i,java,multithreading,Java,Multithreading,我认为我正确地使用了标志,但我想知道出了什么问题。notify()通知一个等待的线程。因此,在T1任务调用了notify()之后,T2或T3将被唤醒,并继续其任务 请注意,您没有循环检查条件。您正在使用if。因此,一旦线程重新启动,它就会退出if块并继续 顺便说一句,即使这是我们的意图,它也没有遵循中描述的规则:虚假的唤醒可能发生,wait应该总是在循环中调用,并在退出wait状态之前检查条件 所以 如果 使用notifyAll()而不是notify() Thxs很多。我同意第二点。但我在各自的
notify()
通知一个等待的线程。因此,在T1任务调用了notify()
之后,T2或T3将被唤醒,并继续其任务
请注意,您没有循环检查条件。您正在使用if
。因此,一旦线程重新启动,它就会退出if块并继续
顺便说一句,即使这是我们的意图,它也没有遵循中描述的规则:虚假的唤醒可能发生,wait应该总是在循环中调用,并在退出wait状态之前检查条件
所以
notifyAll()
而不是notify()
Thxs很多。我同意第二点。但我在各自的类中使用的循环是自己的。这不起作用。哇!!!在使用while循环代替If之后,我总是得到准确的答案。Thxs JB Nizet..但是我真的不明白为什么它不能与If一起工作。你能详细解释一下ifT1启动时gng有什么问题,并且不会因为twoFlag为false而被阻止吗。T2和T3被阻断。然后T1将threeFlag设置为true,并调用notify()。然后T2或T3被唤醒。你不能说。无论线程是什么,它都会退出等待调用,然后退出if,而不会再次检查if条件。
package com.facebook.dao;
public class ManyThreads {
public static void main(String[] args) {
// TODO Auto-generated method stub
targets target = new targets();
T1 x = new T1(target);
T2 y = new T2(target);
T3 z = new T3(target);
Thread t1 = new Thread(x);
Thread t2 = new Thread(y);
Thread t3 = new Thread(z);
t1.start();
t2.start();
t3.start();
}
}
class targets {
boolean twoFlag = false;
boolean threeFlag = true;
boolean fiveFlag = true;
int i = 7, j = 100, k = 1000;
public synchronized void twoMul() {
if (twoFlag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(i * 2);
threeFlag = false;
twoFlag = true;
notify();
}
public synchronized void threeMul() {
if (threeFlag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(j * 3);
fiveFlag = false;
threeFlag = true;
notify();
}
public synchronized void fiveMul() {
if (fiveFlag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(k * 5);
twoFlag = false;
fiveFlag = true;
notify();
}
}
class T1 implements Runnable {
targets t;
T1(targets y) {
this.t = y;
}
public void run() {
for (int i = 0; i < 3; i++) {
t.twoMul();
}
}
}
class T2 implements Runnable {
targets t;
T2(targets y) {
this.t = y;
}
public void run() {
for (int i = 0; i < 3; i++) {
t.threeMul();
}
}
}
class T3 implements Runnable {
targets t;
T3(targets y) {
this.t = y;
}
public void run() {
for (int i = 0; i < 3; i++) {
t.fiveMul();
}
}
}