我正在尝试同步三个线程来打印 012012012012.... 但它无法正常工作。每个线程都分配有一个数字,当它收到来自主线程的信号时,它将打印该数字。以下程序有问题,我无法发现。
public class Application {
public static void main(String[] args) {
int totalThreads = 3;
Thread[] threads = new Thread[totalThreads];
for (int i = 0; i < threads.length; i++) {
threads[i] = new MyThread(i);
threads[i].start();
}
int threadIndex = 0;
while (true) {
synchronized(threads[threadIndex]) {
threads[threadIndex].notify();
}
threadIndex++;
if (threadIndex == totalThreads) {
threadIndex = 0;
}
}
}
}
class MyThread extends Thread {
private int i;
public MyThread(int i) {
this.i = i;
}
@Override
public void run() {
while (true) {
synchronized(this) {
waitForSignal();
System.out.println(i);
}
}
}
private void waitForSignal() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
你需要更多的协调。这notify
打电话不立即地唤醒线程并强制其继续。相反,想想notify
例如向该线程发送电子邮件以告知其可以继续。想象一下,如果您希望 3 个朋友按顺序给您打电话。您向朋友 1 发送了一封电子邮件给您打电话,等了一秒钟,向朋友 2 发送了一封电子邮件,等了一秒钟,然后向朋友 3 发送了一封电子邮件。您认为您会按照这个顺序接到电话吗?
增加更多协调的一种方法是拥有一些共享状态来指示轮到谁了。如果你所有的朋友都能看到你的房子,你可以在房子外面贴一个号码,表明轮到谁打电话了。每个朋友都会等到看到自己的号码,然后再打电话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)