Java - 暂停线程直到其他线程事件

Java - suspend thread until other thread event

我有一个对象 A,我每秒更新一些数据,其他对象 B 和 C 每次更新只希望使用一次数据。 每个对象并行工作。

如何让B和C等待A的更新?

我见过一些类似的问题,但他们的回答对我没有帮助。 我已经看到我可以在对象 D 上使用 "synchronized" 块,但他们只是放置块而没有告诉如何实例化或共享该对象。

以下代码是我用于测试的代码。我设法让它们并行工作,但我被暂停部分卡住了。

这是 A

的 class
public class Master{
  public static void main(String[] args) throws Exception {
    Worker B = new Worker("B");
    B.start();

    Worker C = new Worker("C");
    C.start();

    while(true)
    {
      Thread.sleep(1000);
      // update data
      // notify every thread waiting that they can resume
    }
  }
}

这是用于 B 和 C 的 class

public class Worker extends Thread
{
  Worker(String name)
  {
    super("Worker " + name);
  }

  public void run()
  {
    int i = 0;
    while(!this.isInterrupted())
    {
      // wait for A to update data
      System.out.println(i);
      i++;
    }
    System.out.println("thread interrupted");
  }
}

从那里,我需要为我正在寻找的目的添加什么?

不确定我是否理解正确,但这可能值得您检查一下: https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html

要做到非常低的水平,只使用 lang API,你应该使用 wait/notifyAll。

不是我用Main.class作为任意对象来同步

public class Main {

    public static void main(String[] args) {
        SharedData sharedData = new SharedData();
        Worker w1 = new Worker("Worker 1", sharedData);
        Worker w2 = new Worker("Worker 2", sharedData);

        w1.start();
        w2.start();

        while (true) {
            try {
                Thread.sleep(1000);
                sharedData.increase();;
                System.out.println("Master: " + sharedData.value());
                synchronized (Main.class) {
                    Main.class.notifyAll();
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

class SharedData {
    private int data = 0;

    public void increase () {
        data++;
    }

    public int value() {
        return data;
    }

}

class Worker extends Thread {
    private String workerName;
    private SharedData sharedData;

    public Worker(String workerName, SharedData sharedData) {
        super();
        this.workerName = workerName;
        this.sharedData = sharedData;
    }

    @Override
    public void run() {
        while (true) {
            try {
                synchronized (Main.class) {
                    Main.class.wait();
                }
                System.out.println(workerName + ": " + sharedData.value());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
}

为什么要使用线程?为什么不这样做呢?

public class Master {
    public static void main(String[] args) {
        Worker B = new Worker("B");
        Worker C = new Worker("C");

        while(true) {
            Thread.sleep(1000);
            updateData();
            B.doWork();
            C.doWork();
        }
    }
}

public class Worker
{
    public void doWork() {
        System.out.println(i);
        i++;
    }

    private int i = 0;
}