通过 2 个 diss 线程交替打印奇数/偶数。程序并未结束。 EVEN 线程处于等待状态。尝试在 while 循环外部添加“notifyAll()”。另外,如果我在 while 循环之外设置 EvenFlag/oddFlag,线程名称会更改回 Thread1 和 Thread2,不知道为什么..
import java.util.concurrent.Callable;
import java.util.concurrent.locks.Lock;
public class MultiThreading {
public static void main(String[] args) {
// TODO Auto-generated method stub
Runnable r = new PrintNum();
Thread t0 = new Thread(r, "ZERO");
Thread todd = new Thread(r, "Thread1");
Thread teven = new Thread(r, "Thread2");
t0.start();
todd.start();
teven.start();
}
public static class PrintNum implements Runnable {
boolean zeroFlag = true;
boolean evenFlag = false;
boolean oddFlag = false;
int count = 0;
int limit = 100;
@Override
public void run() {
synchronized (this) {
while (count <= limit) {
if (zeroFlag) {
System.out.println(Thread.currentThread().getName() + ":" + count);
count++;
zeroFlag = false;
oddFlag = true;
break;
}
if (evenFlag) {
if (count == 2)
Thread.currentThread().setName("EVEN");
System.out.println(Thread.currentThread().getName() + ":" + count);
count++;
evenFlag = false;
oddFlag = true;
notify();
while (!evenFlag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
if (oddFlag) {
if (count == 1)
Thread.currentThread().setName("ODD");
System.out.println(Thread.currentThread().getName() + ":" + count);
count++;
evenFlag = true;
oddFlag = false;
notify();
while (!oddFlag) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
}
}
最佳答案
我不想表现得无礼,在学习时提问是可以的,但看起来你是在试图让 Stackoverflow 上的某人完成你的作业……
只需在 while block 之后的 run 方法中添加以下几行,否则您的线程之一将保持等待状态。
evenFlag = true;
oddFlag = true;
notify();
尝试添加 System.out.println/debug 行,看看下次发布问题之前会发生什么。另外,尝试使用 Java 并发 API,而不是手动同步线程,AtomicInteger 将在几行代码中完成您在此处尝试执行的操作。
关于java - 多线程-奇偶数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48528132/