Различие между Executors.newSingleThreadExecutor () .execute (команда) и новым потоком (команда) .start ();

30
задан skaffman 25 December 2009 в 09:06
поделиться

4 ответа

Поведение, практически ничего.

Однако, имея экземпляр исполнителя , вы можете отправить ему несколько заданий, и они будут выполняться одно за другим. Вы не можете сделать это просто с помощью необработанной Темы .

.
40
ответ дан 27 November 2019 в 23:24
поделиться

Может быть много различий, но я покажу Вам одно различие, которое я нашел очень важным для понимания:

public void sendEventSingleThreadExecutor(Event e){
  Executor.singleThreadExecutor().execute(()->{//send the event here})
}

Теперь, даже если Вы вызов sendEventSingleThreadExecutor метод 10 раз , это будет использовать только единственный поток для отправки их. Это не создаст новый поток каждый раз. Что означает, что события будут отправлены последовательно или синхронно ! Можно читать больше от здесь :

Теперь видят ниже примера с новым потоком

public void sendEventThread(Event e){
  Thread(//send the event here).start();
}

, Если Вы вызов это 10 раз , он создаст 10 новых потоков . Что означает, выполнение будет асинхронное ! И это могло быть опасно , это может создать много потоков в зависимости от того, сколько раз Вы вызываете функции sendEventThread.

Обратите внимание на то, что, код только для демонстрационной цели, он мог бы иметь синтаксическую ошибку! , Если Вы находите какое-либо неправильное описание здесь, я буду рад быть исправленным.

еще Некоторая информация от здесь

newSingleThreadExecutor. Однопоточный исполнитель создает единственный рабочий поток для обработки задач, заменяя его, если это неожиданно умирает. Задачи, как гарантируют, будут обработаны последовательно согласно порядку, наложенному очередью задачи (FIFO, LIFO, первоочередной заказ). [4]

[4] Однопоточные исполнители также обеспечивают достаточную внутреннюю синхронизацию, чтобы гарантировать, что любые записи памяти, сделанные задачами, видимы к последующим задачам; это означает, что объекты могут быть безопасно ограничены “task thread” даже при том, что тот поток может время от времени заменяться другим.

0
ответ дан 27 November 2019 в 23:24
поделиться

Одно из заметных отличий: когда вы запускаете new Thread(someRunnable).start();, когда runnable завершается, поток тихо умирает.

Исполнитель, однако, будет продолжать работать до тех пор, пока вы его не выключите. Поэтому при выполнении Executors.newSingleThreadExecutor().execution(command) Когда вы думаете, что ваше приложение или JVM может быть завершено, Исполнитель все равно может быть запущен в фоновом потоке.

.
21
ответ дан 27 November 2019 в 23:24
поделиться

С помощью Executor.execution, если в Executor будет брошена ошибка Error или RuntimeException, она будет бесшумно проглочена, а new Thread() распечатана на System.err.

.
13
ответ дан 27 November 2019 в 23:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: