Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Фиксатор Countdown часто используется для полной противоположности Вашего примера. Обычно у Вас было бы много потоков, блокирующихся на, "ждут ()", который был бы все запускаться одновременно, когда countown достиг нуля.
final CountDownLatch countdown = new CountDownLatch(1);
for (int i = 0; i < 10; ++ i){
Thread racecar = new Thread() {
public void run() {
countdown.await(); //all threads waiting
System.out.println("Vroom!");
}
};
racecar.start();
}
System.out.println("Go");
countdown.countDown(); //all threads start now!
Вы могли также использовать это в качестве MPI-стиля "барьер", который заставляет все потоки ожидать других потоков для наверстывания до определенного момента перед продолжением.
final CountDownLatch countdown = new CountDownLatch(num_thread);
for (int i = 0; i < num_thread; ++ i){
Thread t= new Thread() {
public void run() {
doSomething();
countdown.countDown();
System.out.printf("Waiting on %d other threads.",countdown.getCount());
countdown.await(); //waits until everyone reaches this point
finish();
}
};
t.start();
}
, Который все сказали, фиксатор Countdown может безопасно использоваться таким образом, Вы показали в своем примере.
CountDownLatch используется, чтобы запустить серию потоков и затем ожидать, пока все они не завершены (или пока они не звонят countDown()
данное количество раз.
Семафор используется для управления количеством параллельных потоков, которые используют ресурс. Тот ресурс может быть чем-то как файл или мог быть CPU путем ограничения количества выполнения потоков. Количество на Семафоре может пойти вверх и вниз, как различные потоки звонят acquire()
и release()
.
В Вашем примере, Вы по существу используете Семафор в качестве своего рода количества Фиксатор. Учитывая, что Ваше намерение состоит в том, чтобы ожидать на всем окончании потоков, использование эти CountdownLatch
делает Ваше намерение более ясным.
Рассмотрение источника в свободном доступе, нет никакого волшебства в реализации этих двух классов, таким образом, их производительность должна быть почти такой же. Выберите тот, который делает Ваше намерение более очевидным.
CountdownLatch заставляет потоки ожидать на ждании () метод до такого времени, как количество достигло нуля. Таким образом, возможно, Вы хотите, чтобы все Ваши потоки ожидали до 3 вызовов чего-то, тогда все потоки могут пойти. Фиксатор обычно не может сбрасываться.
Семафор А позволяет потокам получать разрешения, который препятствует тому, чтобы слишком много потоков выполнились сразу, блокируясь, если это не может получить разрешение (разрешения), это требует для продолжения. Разрешения могут быть возвращены к Семафору, позволяющему другие потоки ожидания продолжаться.