Кода -копия выглядит следующим образом:
пакет com.yao;
Импорт java.util.concurrent.countdownlatch;
импортировать java.util.concurrent.executorservice;
импортировать java.util.concurrent.executors;
/**
* Countdownlatch - это счетчик, который имеет начальное число,
* Поток, ожидающий этого счетчика, должна подождать, пока счетчик не будет равен нулю, прежде чем продолжить.
*/
открытый класс countdownlatchtest {
/**
* Поток, который инициализирует компонент
*/
Public Static Class ComponentThread реализует Runnable {
// Прилавок
Countdownlatch Latch;
// идентификатор компонента
int id;
// построить метод
public ComponentThread (CountDownLatch Latch, INT ID) {
this.latch = latch;
this.id = id;
}
public void run () {
// Инициализировать компонент
System.out.println ("инициализация компонента" + id);
пытаться {
Thread.sleep (500 * id);
} catch (прерванная экспрессия e) {
}
System.out.println («Компонент» + ID + «Инициализирован!»);
// уменьшить счетчик на один
latch.countdown ();
}
}
/**
* Запустите сервер
*/
public static void startererver () бросает исключение {
System.out.println («Сервер запускается»);
// инициализируйте обратный отсчет с начальным значением 3
Countdownlatch latch = new countdownlatch (3);
// запустить 3 потока для запуска 3 компонентов соответственно
Executorservice service = executors.newcachedthreadpool ();
service.submit (new ComponentThread (Latch, 1));
service.submit (new ComponentThread (Latch, 2));
service.submit (new ComponentThread (Latch, 3));
service.shutdown ();
// ожидание инициализации 3 компонентов
latch.await ();
// Когда все необходимые три компонента будут завершены, сервер может продолжаться
System.out.println («Сервер встал!»);
}
public static void main (string [] args) бросает исключение {
Countdownlatchtest.startServer ();
}
}