Что такое ExecutorService в Java и как его создать?



В этой статье рассматривается концепция субинтерфейса ExecutorService в Java с различными примерами для объяснения создания потоков и управления ими в Java.

Язык программирования Java очень эффективно работает с приложения, которые требуют одновременного выполнения задач в потоке. Любому приложению становится сложно одновременно выполнять большое количество потоков. Итак, чтобы преодолеть эту проблему, поставляется с ExecutorService, который является подчиненным интерфейсом . В этой статье мы обсудим функциональность ExecutorService в Java. В этом блоге рассматриваются следующие темы:

Что такое Executor Framework?

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





Исполнитель - помогает в создании и управлении потоками в приложении. В поможет вам в следующих задачах.

  • Создание потоков: он предоставляет множество методов для создания потоков, которые помогают в одновременном запуске ваших приложений.



  • Управление потоками: он также управляет жизненным циклом потока. Вам не нужно беспокоиться о том, активен ли поток, занят или мертв, прежде чем отправлять задачу на выполнение.

  • Отправка и выполнение задач: платформа Executor предоставляет методы для отправки задач в пуле потоков, а также дает возможность решать, будет ли поток выполняться или нет.

исполнитель-сервис-исполнитель в Java -edureka

ExecutorService в примере Java

Это субинтерфейс среды исполнителя, который добавляет определенные функции для управления жизненным циклом потока приложения. Он также предоставляет метод submit (), который может принимать как запускаемые, так и вызываемые объекты.



В следующем примере мы создадим ExecutorService с одним потоком, а затем отправим задачу для выполнения внутри потока.

import java.util.concurrent.ExecutorService import java.util.concurrent.Executors открытый класс Пример {public static void main (String [] args) {System.out.println ('Inside:' + Thread.currentThread (). getName ( )) System.out.println ('создание ExecutorService') ExecutorService executorservice = Executors.newSingleThreadExecutor () System.out.println ('создание исполняемого') Runnable runnable = () -> {System.out.println ('внутри: '+ Thread.currentThread (). GetName ())} System.out.println (' отправить задачу, указанную исполняемым файлом, в службу-исполнитель ') executeorservice.submit (runnable)}}
 Вывод: Внутри: основное создание ExecutorService, создание исполняемого, отправка задачи, указанной исполняемым файлом, в ExecutorService внутри: pool-1-thread-1

Вышеупомянутое показывает, как мы можем создать ExecutorService и выполнить задачу внутри исполнителя. Если задача отправлена ​​на выполнение, а поток в настоящее время занят выполнением другой задачи, то задача будет ждать в очереди, пока поток не освободится для ее выполнения.

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

Реализации Java ExecutorService

ExecutorService очень похож на пул потоков. Фактически, реализация ExecutorService в java.util.concurrent пакет - реализация пула потоков. ExecutorService имеет следующие реализации в пакете java.util.concurrent:

ThreadPoolExecutor

ThreadPoolExecutor выполняет указанные задачи, используя один из своих потоков, объединенных в пул.

Создание threadPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = новый threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, новый LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor - это ExecutorService, который может планировать выполнение задач после задержки или повторное выполнение с фиксированным интервалом времени между каждым выполнением.

пример

ScheduledExecutorService scheduledexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture schedulefuture = scheduleExecutorService.schedule (new Callable () {вызов общедоступного объекта () выдает исключение {System.out.println ('выполнено') return 'named'}}. СЕКУНДЫ)

Использование ExecutorService

Есть несколько разных способов делегировать задачи ExecutorService.

  • выполнить (Выполнить)

  • отправить (запускается)

  • invokeAny ()

  • invokeAll ()

Выполнить Runnable

Выполнение Java ExecutorService (Runnable) принимает объект java.lang.Runnable и выполняет его асинхронно.

ExecutorService executorService = Executors.newSingleThreadExecutor () ExecutorService.execute (новый Runnable () {public void run () {System.out.println ('асинхронная задача')}}) executeorService.shutdown ()

Невозможно получить результат выполнения Runnable, для этого вам нужно использовать Callable.

Отправить Runnable

Метод Java ExecutorService submit (Runnable) принимает реализацию Runnable и возвращает будущий объект. Будущий объект можно использовать для проверки завершения выполнения Runnable.

Future future = executorService.submit (new Runnable () {public void run () {System.out.println (: asynchronous task ')}}) future.get () // возвращает null, если задача завершена правильно.

Отправить Callable

Метод submit (Callable) Java ExecutorService аналогичен submit (Runnable), но для него используется Java Callable вместо Runnable.

Future future = executorService.submit (new Callable () {вызов общедоступного объекта () выдает исключение {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 Вывод: Асинхронный вызываемый future.get = вызываемый результат

invokeAny ()

Метод invokeAny () принимает коллекцию вызываемых объектов. Вызов этого метода не возвращает будущего, но возвращает результат одного из вызываемых объектов.

ExecutorService executorService = Executors.newSingleThreadExecutor () Установитьcallables = новый HashSet() callables.add (new Callable () {вызов public String () выдает исключение {return'task A '}}) callables.add (new Callable () {вызов public String () выдает исключение {return'task B'} }) callables.add (new Callable () {вызов public String () выдает исключение {return'task C '}}) String result = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .неисправность()

Когда вы запустите приведенный выше код, результат изменится. Это может быть задача A, задача B и так далее.

InvokeAll ()

Метод invokeAll () вызывает все вызываемые объекты, переданные в качестве параметров. Он возвращает будущие объекты, которые можно использовать для получения результатов выполнения каждого вызываемого объекта.

ExecutorService executorService = Executors.newSingleThreadExecutor () Установитьcallables = новый HashSet() callables.add (new Callable () {вызов public String () выдает исключение {return 'Task A'}}) callables.add (new Callable () {вызов public String () выдает исключение {return 'Task B'} }) callables.add (new Callable () {вызов public String () выдает исключение {return 'Task C'}}) Списокfutures = executorService.invokeAll (callables) для (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable vs Callable

Запускаемый и вызываемый интерфейсы очень похожи друг на друга. Разница видна в объявлении интерфейсы. Оба интерфейса представляют собой задачу, которая может выполняться одновременно потоком или ExecutorService.

Вызываемое объявление:

общедоступный интерфейс Callable {вызов открытого объекта () вызывает исключение}

Выполняемое объявление:

открытый интерфейс Runnable {public void run ()}

Основное различие между ними заключается в том, что метод call () может возвращать объект из вызова метода. И метод call () может вызывать а метод run () не может.

жизненный цикл активности Android

отменить задачу

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

future.cancel ()

Завершение работы ExecutorService

Чтобы потоки не запускались даже после завершения выполнения, следует закрыть ExecutorService.

неисправность()

Чтобы завершить потоки внутри ExecutorService, вы можете вызвать метод shutdown ().

executeorService.shutdown ()

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

Если вы нашли эту статью «ExecutorService в Java» релевантной, ознакомьтесь с надежная компания онлайн-обучения с сетью из более чем 250 000 довольных учащихся по всему миру.

Мы здесь, чтобы помочь вам на каждом этапе вашего пути и предложить учебную программу, предназначенную для студентов и профессионалов, которые хотят стать Java-разработчиками. Курс разработан, чтобы дать вам хорошее начало в программировании на Java и обучить вас основным и продвинутым концепциям Java, а также различным любить Спящий режим & .

Если у вас возникнут какие-либо вопросы, не стесняйтесь задавать все свои вопросы в разделе комментариев «ExecutorService в Java», и наша команда будет рада ответить.