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

标签 java multithreading thread-synchronization

我正在尝试同步三个线程来打印 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 调用不会立即唤醒线程并强制其继续。相反,将通知视为向线程发送电子邮件以使其知道它可以继续。想象一下,如果您希望 3 个 friend 按顺序给您打电话。您向 friend 1 发送了一封电子邮件给您打电话,等了一秒钟,向 friend 2 发送了一封电子邮件,等了一秒钟,然后向 friend 3 发送了一封电子邮件。您认为您会按照这个顺序接到电话吗?

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

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

相关文章:

java - 从java中的图像中删除Exif数据?

java - 如何保证线程的执行顺序

java - 定时器事件是否同步?

c++ - pselect() 与循环中的 accept()

c++ - 当发出特定事件信号时,立即退出正在运行的线程

java - 多个线程在java中使用同一个对象是否复制它?

Java 多重构造函数设置问题

java - Netbeans 失败 - 应用程序已存在于路径/

java - Spring 中的自定义身份验证

c++ - 几个线程的多个任务