【发布时间】:2016-09-29 12:31:42
【问题描述】:
我写了一个House类,它有四个同步方法。 我写了四个线程,并希望它们一个接一个地运行。但是只有第一个和第二个运行了,另一个没有?
public class House {
private boolean hasFoundation = false;
private boolean hasFrame = false;
private boolean hasWall = false;
private boolean hasRoof = false;
public synchronized void buildFoundation() {
hasFoundation = true;
System.out.println("foundation Ok");
notifyAll();
}
public synchronized void buildFrame() throws InterruptedException {
if (!hasFoundation) {
wait();
} else {
hasFrame = true;
System.out.println("frame ok");
notifyAll();
}
}
public synchronized void buildWall() throws InterruptedException {
if (!hasFrame) {
wait();
} else {
hasWall = true;
System.out.println("wall ok");
notifyAll();
}
}
public synchronized void buildRoof() throws InterruptedException {
if (!hasWall) {
wait();
} else {
hasRoof = true;
System.out.println("roof ok");
notifyAll();
}
}
}
public class BuildAHouse {
public static void main(String[] args) {
House house = new House();
ExecutorService exec = Executors.newCachedThreadPool();
exec.execute(new FoundationTeam(house));
exec.execute(new WallTeam(house));
exec.execute(new RoofTeam(house));
exec.execute(new FrameTeam(house));
exec.shutdown();
}
}
当运行 main() 时,结果只是: 基础还行 框架没问题
另外两个线程还没有运行!为什么?
...这样的团队类:
public class FoundationTeam implements Runnable {
private House house;
public FoundationTeam(House house) {
this.house = house;
}
@Override
public void run() {
house.buildFoundation();
}
}
这只是一个演示,我想知道如何使用wait()和notifyAll()。
请解决这个问题好吗?它只是我想做的所有事情的一部分。 请告诉我为什么它不起作用,以及如何解决?
当调用wait()时,这个对象不会被释放?而其他线程不能调用其他同步方法?
【问题讨论】:
-
我不知道你在那些
...Team类中是什么,但你可能只执行了一次该方法。线程被暂停,当它们收到通知时,它们继续退出该方法,因为它们永远没有机会进入 else 子句,FrameTeam除外 -
我不认为你真的需要
wait()和notifyAll():你这里已经有ExecutorService,那是更高层次的同步抽象。见stackoverflow.com/q/2153663/5521491 -
我认为这不是正确的用例。无论您试图实现这一目标,都可以轻松实现。等待通知的示例:1. 生产者消费者 2. 偶数打印机使用 2 个线程 3. 使用 3 个线程按顺序打印数字
标签: java multithreading java-threads