gpt4 book ai didi

java - 线程同步 - 同步三个线程打印 012012012012..... 不工作

转载 作者:行者123 更新时间:2023-11-30 08:21:48 24 4
gpt4 key购买 nike

我正在尝试同步三个线程来打印 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 个 friend 按顺序给您打电话。你给 friend 1 发了一封电子邮件给你打电话,等了一秒钟,给 friend 2 发了一封电子邮件,等了一秒钟,然后给 friend 3 发了一封电子邮件。你认为你会按这个顺序接到电话吗?

添加更多协调的一种方法是拥有一些共享状态,指示轮到谁了。如果你所有的 friend 都能看到你的房子,你可以在房子外面放一个号码,指示轮到谁打电话。每个 friend 都会等到他们看到他们的号码,然后打电话。

关于java - 线程同步 - 同步三个线程打印 012012012012..... 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24912157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com