Какво е ExecutorService в Java и как да го създам?



Тази статия обхваща концепцията за подинтерфейс Executor ExecutorService в Java с различни примери за обяснение на създаването и управлението на нишки в Java.

Java езикът за програмиране работи много ефективно с приложения, които изискват задачите да се изпълняват едновременно в нишка. За всяко приложение става трудно да изпълнява едновременно голям брой нишки. За да преодолеем този проблем, идва с ExecutorService, който е подинтерфейс на . В тази статия ще обсъдим функционалността на ExecutorService в Java. Следват темите, разгледани в този блог:

Какво е Executor Framework?

Доста по-лесно е да направите и изпълните една или две нишки едновременно. Но става трудно, когато броят на нишките се увеличи до значителен брой. Големите многонишкови приложения ще имат стотици нишки, работещи едновременно. Следователно има пълен смисъл да се отдели създаването на нишка от управлението на нишки в приложение.





Изпълнителят е a ви помага при създаването и управлението на нишки в приложение. The ви помага в следните задачи.

  • Създаване на нишки: Предоставя разнообразни методи за създаване на нишки, които помагат за едновременното стартиране на вашите приложения.



  • Управление на нишки: Той също така управлява жизнения цикъл на нишката. Не е нужно да се притеснявате, ако нишката е активна, заета или мъртва, преди да изпратите задачата за изпълнение.

  • Подаване и изпълнение на задача: Рамката Executor предоставя методи за подаване на задачи в пула от нишки, а също така дава правомощието да реши дали нишката ще бъде изпълнена или не.

executorservice-executorservice в 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 runnable = () -> {System.out.println ('вътре: '+ Thread.currentThread (). GetName ())} System.out.println (' изпратете задачата, посочена от runnable, до изпълнителната служба ') executorservice.submit (runnable)}}
 Изход: Вътре: основно създаване на ExecutorService, създаващо изпълним, изпраща задачата, посочена от изпълнимия, на изпълнителната услуга вътре: pool-1-thread-1

Гореизложеното показва как можем да създадем ExecutorService и да изпълним задача вътре в изпълнителя. Ако задача е изпратена за изпълнение и в момента нишката е заета да изпълнява друга задача, тогава задачата ще изчака на опашка, докато нишката е свободна да я изпълни.

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

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

ExecutorService много прилича на пула от нишки. Всъщност изпълнението на ExecutorService в java.util.concurrent пакет е изпълнение на нишка. ExecutorService има следните реализации в пакета java.util.concurrent:

ThreadPoolExecutor

ThreadPoolExeecuter изпълнява зададените задачи с помощта на една от вътрешно събраните нишки.

Създаване на threadPoolExecutor

int corePoolSize = 5 int maxPoolSize = 10 long keepAliveTime = 5000 ExecutorService threadPoolExecutor = new threadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, new LinkedBlockingQueue ())

ScheduledThreadPoolExecutor

Java.util.concurrent.ScheduledThreadPoolExecutor е ExecutorService, която може да планира задачи, които да се изпълняват след забавяне или да се изпълняват многократно с фиксиран интервал от време между всяко изпълнение.

Пример

ScheduledExecutorService scheduledexecutorservice = Executors.newScheduledThreadPool (5) ScheduledFuture rasporedfuture = rasporedExecutorService.schedule (ново Callable () {публично извикване на обект () хвърля изключение {System.out.println ('изпълнено'), върнато 'Time'nit', 'изпълнено') СЕКУНДИ)

ExecutorService Употреба

Има няколко различни начина за делегиране на задачи на ExecutorService.

  • изпълни (изпълним)

  • изпрати (изпълним)

  • invokeAny ()

  • invokeAll ()

Изпълнете Runnable

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

ExecutorService executorService = Executors.newSingleThreadExecutor () executorService.execute (new Runnable () {public void run () {System.out.println ('asynchronous task')}}) executorService.shutdown ()

Няма начин да получите резултата от изпълнението Runnable, за това трябва да използвате Callable.

Изпратете Runnable

Java ExecutorService методът за представяне (Runnable) взема изпълнение на Runnable и връща бъдещ обект. Бъдещият обект може да се използва за проверка дали Runnable е завършил изпълнението.

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

Изпратете Callable

Методът за изпращане на Java ExecutorService (Callable) е подобен на изпращането (Runnable), но отнема Java Callable вместо Runnable.

Future future = executorService.submit (new Callable () {public Object call () хвърля изключение {System.out.println ('Asynchronous callable') return 'Callable Result'}}) System.out.println ('future.get ( ) = 'future.get ())
 Изход: Асинхронно извикващо се бъдеще.get = Извикващ се резултат

invokeAny ()

Методът invokeAny () взема колекция от извикващи се обекти. Извикването на този метод не връща бъдеще, а връща резултата от един от обектите Callable.

ExecutorService executorService = Изпълнители.newSingleThreadExecutor () Setcallables = нов HashSet() callables.add (new Callable () {public String call () хвърля изключение {return'task A '}}) callables.add (new Callable () {public String call () хвърля изключение {return'task B'} }) callables.add (new Callable () {public String call () хвърля изключение {return'task C '}}) String result = executorService.invokeAny (callables) System.out.println (' result = '+ result) executorService .изключвам()

Когато стартирате горния код, резултатът се променя. Може да е Задача А, Задача Б и т.н.

InvokeAll ()

Методът invokeAll () извиква всички Callable обекти, предадени като параметри. Той връща бъдещите обекти, които могат да се използват за получаване на резултатите от изпълнението на всеки Callable.

ExecutorService executorService = Изпълнители.newSingleThreadExecutor () Setcallables = нов HashSet() callables.add (new Callable () {public String call () хвърля изключение {return 'Task A'}}) callables.add (new Callable () {public String call () хвърля изключение {return 'Task B'} }) callables.add (new Callable () {public String call () хвърля изключение {return 'Task C'}}) Списъкfutures = executorService.invokeAll (callables) for (Future future: futures) {System.out.println ('future.get =' + future.get ())} executorService.shutdown ()

Runnable срещу Callable

Изпълнителният и извикващи се интерфейси са много сходни помежду си. Разликата е видима в декларацията на интерфейси. И двата интерфейса представляват задача, която може да бъде изпълнена едновременно от нишка или ExecutorService.

Извикваща декларация:

публичен интерфейс Callable {public object call () хвърля изключение}

Изпълнима декларация:

публичен интерфейс Runnable {public void run ()}

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

какво е запазена дума в java

отмяна на задача

Можете да отмените задачата, изпратена до ExecutorService, като просто извикате метода за анулиране на бъдещото изпратено, когато задачата е изпратена.

future.cancel ()

Изключване на услугата

За да предотвратите изпълнението на нишките дори след завършване на изпълнението, трябва да изключите ExecutorService.

изключвам()

За да прекратите нишките в ExecutorService, можете да извикате метода shutdown ().

executorService.shutdown ()

Това ни води до края на тази статия, където научихме как можем да използваме ExecutorService за изпълнение на задачи в нишка. Надявам се да сте наясно с всичко споделено с вас в този урок.

Ако сте намерили тази статия за „ExecutorService в Java“ подходяща, разгледайте доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят.

Ние сме тук, за да ви помогнем при всяка стъпка по вашето пътуване и да изготвим учебна програма, предназначена за студенти и професионалисти, които искат да бъдат разработчик на Java. Курсът е предназначен да ви даде начален старт в програмирането на Java и да ви обучи както за основни, така и за разширени Java концепции, заедно с различни като Хибернация & .

Ако срещнете някакви въпроси, не се колебайте да зададете всичките си въпроси в раздела за коментари на „ExecutorService в Java“ и нашият екип ще се радва да отговори.