使用wait和notify打印来自不同线程的值

时间:2016-02-08 16:47:02

标签: java multithreading wait notify


我有三个线程ThreadA,ThreadB和ThreadC分别在循环中打印A,B和C值。
我希望输出像A,B,C再一样A,B和C直到循环在threads.中执行。我想使用wait和notify编写这个示例程序。下面的代码是打印所需的输出,但有时我只是在输出中看到“A”,我无法弄清楚案例。

checkLengthSelect

4 个答案:

答案 0 :(得分:1)

您致电wait,但未经过测试是否还有等待的事情。你打电话给notify,但是你还没有改变通知另一个线程所需的任何东西。您拥有所有这些synchronized方法,但没有要保护同步的共享状态。

您的代码中没有任何内容有任何意义,似乎您从根本上不了解wait / notify机制的作用。 wait函数允许线程等待某个共享状态发生更改,notify函数允许一个线程告诉其他一些共享状态已更改。但必须有一些共享状态,因为wait / notify机制(不像锁或sempahore)是内部无状态的。

您可能应该有一些受同步保护的共享状态。它应该编码下一个应该进行的线程。如果您需要打印,但共享状态表明它不是您的回合,那么您有wait的内容。当你打印并制作一些其他线程接下来要打印时,那么你有notify个其他线程的东西。

答案 1 :(得分:0)

考虑通过阻塞队列创建一个彼此连接的线程环。然后你可以在戒指周围传递一个令牌。每个线程等待接收令牌,打印其输出,将令牌传递给环中的下一个线程,然后返回等待。

答案 2 :(得分:0)

printf

答案 3 :(得分:0)

package com.test.algorithms;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class PrintInOrder1 {

    private static Integer[] a = { 1, 1, 1 };
    private static Integer[] b = { 2, 2, 2 };
    private static Integer[] c = { 3, 3, 3 };
    private static Integer[] d = { 4, 4, 4 };

    public static void main(String[] args) throws InterruptedException {

        QueueOrder1 q1 = null;
        QueueOrder1 q2 = null;
        QueueOrder1 q3 = null;
        QueueOrder1 q4 = null;

        q1 = new QueueOrder1(a);
        q2 = new QueueOrder1(b);
        q3 = new QueueOrder1(c);
        q4 = new QueueOrder1(d);

        q1.setChild(q2);
        q1.isPrinted = true;

        q2.setChild(q3);

        q3.setChild(q4);

        q4.setChild(q1);

        Thread t1 = new Thread(q1);
        Thread t2 = new Thread(q2);
        Thread t3 = new Thread(q3);
        Thread t4 = new Thread(q4);


        t1.start();
        t2.start();
        t3.start();
        t4.start();



        t1.join();
        t2.join();
        t3.join();
        t4.join();

    }

}

class QueueOrder1 implements Runnable {

    Integer[] arr;
    QueueOrder1 child;
    Queue<Integer> queue = new LinkedList<>();
    boolean isPrinted = false;

    QueueOrder1(Integer[] arr) {
        this.arr = arr;
        queue.addAll(Arrays.asList(arr));
    }

    public QueueOrder1 getChild() {
        return child;
    }

    public void setChild(QueueOrder1 child) {
        this.child = child;
    }

    public void run() {

        while (!this.queue.isEmpty()) {

            synchronized (this) {
                if (!this.isPrinted) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                } 
            }

            System.out.print("**" + this.queue.poll());
            this.isPrinted = false;
            synchronized (this.child) {
                if(!this.child.isPrinted) {
                    this.child.notify();
                }
            }

        }
    }
}