Хорошо название говорит об этом, в чем разница между Executors.newSingleThreadExecutor().execute(command)
и new Thread(command).start();
Разница между Executors.newSingleThreadExecutor(). Execute (command) и новая Thread (команда).start();
Ответ 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)