[英]How can I use wait/notify to make these threads work alternatively?
我想了解如何让两个线程在正确的时间互相挂起,我尝试查看文档和其他内容,但理解不够; 我想做一个像这样的程序:
ThreadA 一次在 ThreadB 中写入一个int
作为属性,然后 B 打印它。 A 等待写入另一个int
,直到它从 B 确认打印了前一个 int,并且 B 必须等待 A 在打印之前写入int
。
如果我使用A/B.suspend()
和A/B.resume()
情况会更清楚,但我不明白如何用wait
和notify
做同样的事情。
这是我所做的一个例子(不工作):
public class Main {
public static void main(String[] args) {
Object lock=new Object();
ThreadB tB=new ThreadB(lock);
tB.start();
ThreadA tA=new ThreadA(lock);
tA.start();
}
}
线程A:
public class ThreadA extends Thread {
private Object lock;
private ThreadB threadB;
public ThreadA(Object b,ThreadB tb) {
lock=b;
threadB=tb;
}
public void run() {
for(int i=0;i<10;i++) {
threadB.setI(i);
synchronized(lock) { //(try/catch omitted for shortness)
lock.notify(); //to tell B the int was loaded
lock.wait(); //to stop until B tells me that the int has been used
}
}
//join or something for B
}
}
线程 B:
public class ThreadB extends Thread {
private Object lock;
int i;
public ThreadB(Object b) {
lock=b;
}
public void setI(int x) {
i=x;
}
public void run() {
while(true) {
synchronized(lock) { //(try/catch omitted for shortness)
lock.wait(); //to wait until A loaded the int
}
int a=i;
System.out.println(a);
synchronized(lock) {
lock.notify(); //to tell A it can load the next int
}
}
}
}
我正在考虑使用lock
作为令牌,但我认为这还不够,例如可能会发生 A 为 B 调用notify
,然后 B 继续通知 A,但 A 甚至还没有等待......
您可以考虑使用共享标志来决定每个线程何时可以访问该变量。 见这个例子: processor.java每个方法(生产和消费)在自己的线程中独立执行(见app.java )。
他们使用列表的大小来决定他们是否可以访问该列表。
希望能帮助到你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.