我寫了一個House類,它有四個同步方法。 我寫了四個線程,並希望他們一個接一個地運行。但只是第一次和第二次跑,另一次沒有?如何使用wait()和notifyAll()逐個運行線程?
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(),結果只是: 基礎確定 框架確定
其他兩個線程運行沒有帶!爲什麼?
的... Team類是這樣的:
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' – kevto
我不認爲你真的需要'wait()'和'notifyAll()':這裏已經有'ExecutorService',這是更高層次的同步抽象。請參閱http://stackoverflow.com/q/2153663/5521491 –
我不認爲這是正確的用例。無論你想要實現這一點,都可以輕鬆實現。 例如等待通知: 1.生產者消費者 2.偶奇打印機使用2線程 3.使用3個線程以順序方式打印數字 – cody123