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;
}
我有一个对象 A,我每秒更新一些数据,其他对象 B 和 C 每次更新只希望使用一次数据。 每个对象并行工作。
如何让B和C等待A的更新?
我见过一些类似的问题,但他们的回答对我没有帮助。 我已经看到我可以在对象 D 上使用 "synchronized" 块,但他们只是放置块而没有告诉如何实例化或共享该对象。
以下代码是我用于测试的代码。我设法让它们并行工作,但我被暂停部分卡住了。
这是 A
的 classpublic 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;
}