Подтвердить что ты не робот

Разница между Executors.newSingleThreadExecutor(). Execute (command) и новая Thread (команда).start();

Хорошо название говорит об этом, в чем разница между Executors.newSingleThreadExecutor().execute(command) и new Thread(command).start();

4b9b3361

Ответ 1

Поведение, почти ничего.

Однако, если у вас есть экземпляр Executor, вы можете отправить ему несколько задач и выполнить их один за другим. Вы не можете сделать это просто с помощью raw Thread.

Ответ 2

Одна заметная разница - это когда вы запускаете new Thread(someRunnable).start();, когда runnable завершен, поток будет умирать спокойно.

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

Ответ 3

Если в Executor выдается ошибка или исключение RuntimeException, он будет проглатываться молча, новый Thread() будет печатать его в System.err

Ответ 4

Executors.newSingleThreadExecutor(). execute (command) будет повторно использовать ранее построенный поток, он не будет создавать новый поток, как в случае с новым Thread(). Если поток, который не использовался в течение шестидесяти секунд, завершается, это своего рода пул, содержащий единственный поток, который делает его эквивалентным newFixedThreadPool (1).

Ответ 5

Я предпочитаю использовать ExecutorService или ThreadPoolExecutor даже для однодисковых потоков. Они предлагают большую гибкость.

Посмотрите разделы ExecutorService и ThreadPoolExecutor в связанных вопросах SE:

java Fork/Join pool, ExecutorService и CountDownLatch

Java-приложение Fork/Join vs ExecutorService - когда использовать, который?

Предположим, что вы начали свой собственный поток вместо ExecutorService. В будущем, если есть необходимость в поддержке нескольких потоков, ExecutorService или ThreadPoolExecutor будет предлагать вам лучший контроль и гибкость. Вы можете точно настроить необходимое количество параметров в этих ниже API.

ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, 
TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory,
RejectedExecutionHandler handler)