Я пишу класс 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 () результат будет просто: foundation ok frame ok
два других потока не запустились! Зачем?
класс команды вроде этого:
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
- person kevto   schedule 29.09.2016wait()
иnotifyAll()
: у вас уже естьExecutorService
, это абстракция синхронизации более высокого уровня. См. stackoverflow.com/q/2153663/5521491 - person Adamovskiy   schedule 29.09.2016