Без блока synchronized тоже не проходит.
package com.javarush.task.task28.task2809;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Phaser;
/*
Plants vs Zombies
*/
public class Solution {
public static void main(String[] args) throws InterruptedException {
List<Character> characters = new ArrayList<>();
characters.add(new Plant());
characters.add(new Plant());
characters.add(new Zombie());
characters.add(new Zombie());
characters.add(new Zombie());
start(characters);
}
private static boolean isEveryoneReady = false;
private static void start(List<Character> characters) throws InterruptedException {
// Конструктор регистрирует передаваемое количество участников.
final Phaser phaser = new Phaser(1 + characters.size());
// [phase = 0 parties = 6 arrived = 0]
phaser.arriveAndDeregister(); // уменьшает количество участников на 1
// [phase = 0 parties = 5 arrived = 0]
for (final Character character : characters) {
final String member = character.toString();
System.out.println(member + " присоединился к игре");
new Thread() {
@Override
public void run() {
System.out.println(member + " готовится играть");
// Как только участник достигает этого метода, он ожидает остальных.
phaser.arriveAndAwaitAdvance(); // arrived +1 для каждого прибывшего.
// После этого метода [phase = 1 parties = 5 arrived = 0].
// Может успеть проскочить несколько, поэтому пропускаем по одному.
// В таком режиме синхранизируем наследников.
synchronized (Character.class) {
// System.out.println(member + " was here");
// try {
// Thread.currentThread().sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
if (!isEveryoneReady) {
isEveryoneReady = true;
System.out.println("Игра началась!");
}
// System.out.println(member + " and here");
}
character.run();
}
}.start();
}
}
}