Инструкции CountDownLatch предназначены для вашей ссылки. Конкретный контент заключается в следующем
Countdownlatch - это пакет Java.Util.concurrent Next Class Tool, который позволяет одним или нескольким потокам ждать, пока набор операций не будет завершен в других потоках.
Использование Countdownlatch очень просто. Следующий пример также является тем, что я видел в Интернете, и это очень уместно. Я опубликую это здесь.
открытый тест класса {public static void main (string [] args) {countdownlatch begin = new countdownlatch (1); Countdownlatch end = new Countdownlatch (2); for (int i = 0; i <2; i ++) {Thread Think = новый поток (новый игрок (начало, конец)); Thread.Start (); } try {System.out.println ("Раса начинается"); begin.countdown (); end.await (); System.out.println ("end Race End"); } catch (Exception e) {e.printstackTrace (); }}}/*** Player*/Class Player реализует runnable {private countdownlatch begin; Частный Countdownlatch End; Player (countdownlatch begin, countdownlatch end) {this.begin = begin; this.end = end; } public void run () {try {begin.await (); System.out.println (Thread.currentThread (). GetName () + "прибыл!") ;; end.countdown (); } catch (прерванное искусство e) {e.printstacktrace (); }}}Ниже приведены результаты работы
Вы можете видеть это благодаря использованию CountdownLatch, мы контролируем порядок выполнения потоков.
В приведенном выше коде мы используем метод wawait () и метод обратного отсчета (). Давайте подтвердим их соответствующие функции.
Сначала проверьте метод wait (). Прокомментируйте End.await () в основном методе. Ниже приведен результат запуска после комментирования.
Вы можете видеть, что основная тема не ждет, пока поток, представляющая участника, и прямо объявил, что конкурс закончился! Игра, которая закончилась вначале ---
Здесь можно увидеть, что метод wait () имеет эффект блокировки
Во -вторых, давайте подтвердим метод обратного отсчета и прокомментируем end.countdown () в ветке участника. Ниже приведен результат работы.
Программа работала, и все игроки достигли финиша, но рефери просто не продвигает конец игры. Чего он ждет?
Мы предполагаем, что метод обратного отсчета () имеет эффект пробуждения блокировки.
Тогда мы можем спросить, поскольку у него есть функция пробуждения блокирующего потока, разве невозможно разбудить заблокированный основной поток, если мы вызовут метод обратного отсчета () только один раз?
Давайте попробуем это, расстроен вышеупомянутую аннотацию Coutdown (), снова создадите игрока, код выглядит следующим образом
Class Player2 реализует runnable {private countdownlatch begin; Частный Countdownlatch End; Player2 (countdownlatch begin, countdownlatch end) {this.begin = begin; this.end = end; } public void run () {try {begin.await (); System.out.println (think.currentThread (). GetName () + "прибыл!"); // end.countdown (); } catch (прерванное искусство e) {e.printstacktrace (); }}}Основной метод также изменен следующим образом, создавая двух разных игроков
public static void main (string [] args) {countdownlatch begin = new Countdownlatch (1); Countdownlatch end = new Countdownlatch (2); Thread Think = новый поток (новый игрок (начало, конец)); Thread.Start (); Thread Think2 = новый поток (новый Player2 (начало, конец)); Thread2.start (); try {System.out.println («Раса начинается»); begin.countdown (); end.await (); System.out.println ("end Race End"); } catch (Exception e) {e.printstackTrace (); }}Запустите это, вот результаты
Основная программа была заблокирована и не была пробуждена. Рефери некоторое время использовал туалет!
Кажется, что Countdown () не разбудит потока, это немного похоже на счетчик, обратный отсчет.
Проверьте документацию API, конечно же, мы добавили параметр 2 к конструктору, и нам нужно позвонить в Countdown () 2 раза, чтобы разбудить заблокированный резьбу End.await ().
Countdownlatch end = new Countdownlatch (2);
Подводить итоги,
1. Countdownlatch End = New CountdownLatch (n); // При построении объекта вам необходимо пройти в параметре N.
2. End.await () может блокировать потоки до тех пор, пока метод end.countdown () не называется n временем до того, как поток будет выпущен.
3. end.countdown () можно вызвать в нескольких потоках для расчета количества вызовов, которые являются суммой всех потоков.
В следующем блоге я объясню, как работает CountDownLatch с уровня исходного кода.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.