Когда мы должны использовать поток Java над исполнителем?


исполнитель кажется чистой абстракцией. Когда вы хотите использовать поток напрямую, а не полагаться на более надежного исполнителя?

7 52

7 ответов:

чтобы дать некоторую историю, исполнители были добавлены только как часть стандарта java в Java 1.5. Таким образом, в некотором смысле исполнители можно рассматривать как новую лучшую абстракцию для решения выполняемых задач.

немного чрезмерного упрощения идет... - Исполнители-это потоки, выполненные правильно, поэтому используйте их в предпочтении.

Я использую поток, когда мне нужна обработка сообщений на основе вытягивания. Например, очередь take () - en в цикле в отдельном потоке. Например, вы переносите очередь в дорогостоящий контекст - скажем, соединение JDBC, соединение JMS, файлы для обработки с одного диска и т. д.

прежде чем я буду проклят, у вас есть какой-то сценарий?

Edit:

как утверждают другие,Executor (ExecutorService) интерфейс имеет больше потенциала, так как вы можете использовать Executors to выберите поведение: запланированное, приоритетное, кэшированное и т. д. в Java 5+ или J.u.c backport для Java 1.4.

платформа executor имеет защиту от разбитых runnables и автоматически воссоздает рабочие потоки. Один недостаток на мой взгляд, что вы должны явно shutdown() и awaitTermination() их перед выходом из приложения - что не так просто в GUI приложения. Если вы используете ограниченные очереди, вам нужно указать RejectedExecutionHandler или новые runnables выбрасываются.

вы может, взглянем на Brian Goetz et al: Java Concurrency in Practice (2006)

нет никакого преимущества в использовании необработанных потоков. Вы всегда можете предоставить исполнителям фабрику потоков, поэтому даже опция создания пользовательского потока покрыта.

вы не используете поток, если вам не нужно более конкретное поведение, которое не найдено в самом потоке. Затем вы расширяете поток и добавляете свое специально желаемое поведение.

иначе просто используйте Runnable или Executor.

Ну, я думал, что ThreadPoolExecutor обеспечивает лучшую производительность для управления пулом потоков, минимизируя накладные расходы на создание экземпляра нового потока, выделение памяти...

и если вы собираетесь запустить тысячи потоков, это дает вам некоторую функциональность очереди, которую вам придется программировать самостоятельно...

потоки и исполнители-это разные инструменты, используемые в разных сценариях... Как я вижу, это похоже на вопрос, почему я должен использовать ArrayList, когда я могу использовать HashMap? Они разные...

java.утиль.параллельный пакет предоставляет интерфейс исполнителя и может быть использован для создания потока.

интерфейс исполнитель предоставляет единый способ, выполнение, разработанный, чтобы быть понижением замены для создания общей нити фразеологизм. Если r-запускаемый объект, А e-объект-исполнитель, вы можете заменить

(Новый Поток (r)).start ();

с

e. execute(r);

см. здесь

всегда лучше предпочесть исполнитель до Thread даже для одного потока, как показано ниже

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(1);

можно использовать Thread over Executor в следующих сценариях

  1. ваше приложение нуждается в ограниченном потоке (потоках), а бизнес-логика проста

  2. Если простая многопоточная модель удовлетворяет вашим требованиям без пула потоков

  3. вы уверены в управлении жизненным циклом потоков + сценарии обработки исключений с помощью низкоуровневых API в следующих областях:Inter thread communication, Exception handling, reincarnation of threads из-за непредвиденных ошибок

и последнее

  1. если ваше приложение не нуждается в настройке различных функций ThreadPoolExecutor

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

во всех остальных случаях вы можете пойти на ThreadPoolExecutor