Как да внедрим извикваем интерфейс в Java



Тази статия ще ви предостави подробни и изчерпателни знания за това как да приложите Callable Interface в Java с примери.

Многопоточните програми на Java стават свидетели на използването на екстензив Извикващо се и бъдеще. При задължителните познания за нишките и многопоточността читателите ще могат по-добре да разберат дискусията в тази статия. Както ще обясня в тази статия Callable Interface в Java.

Обобщение на нишките

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





Какво е извикваем интерфейс в Java

За Java 5 беше въведен класът „java.util.concurrent“. Този извикваем интерфейс е въведен чрез пакета за съвпадение, който изглежда подобен на интерфейса Runnable. Той също така може да върне всеки обект и е в състояние да хвърли изключение. Java Callable интерфейс използва Generics, като по този начин прави възможно връщането на всякакъв тип обект. Executor Framework дава метод submit () за изпълнение на Callable реализации в пул от нишки. В действителност Java Executor Framework се придържа към шаблоните WorkerThread.

java-interfaceВ пула от нишки потребителите могат да инициират нишки с помощта на метода Executors.newFixedThreadPool (10) и съответно да му изпращат задача. Runnable действа като цел на нишка и публично void run () метод е задължително внедрен, за да дефинира задачата. Това ще бъде изпълнено от нишки в пула от нишки. Въз основа на наличността на нишките в пула, Executor Framework присвоява работа (изпълнима цел) на нишки.Ако всички нишки се използват, задачата трябва да бъде спряна. След като нишката завърши една задача, тя се връща в пула като налична нишка, която е готова да приеме бъдещи задачи. Callable е подобен на Runnable и може да върне всякакъв тип обект, когато искаме да получим резултат или състояние от задачата.



Връщане на извикваем интерфейс

Java Callable връща java.util.concurrent. Java Future предлага метод cancel () за елиминиране на свързаната с това извикваща задача. Това е претоварена версия на метода get (), където може да се определи определено време за изчакване на резултата. Полезно е да се избягва текуща нишка, която може да бъде блокирана за по-дълъг период. Моля, не забравяйте, че методът get е синхронен метод и докато извикващият завърши своята задача и върне стойност, ще трябва да изчака извикващ се.

Съществуват и методите “isDone ()” и “isCancelled ()” за извличане на текущото състояние на свързана извикваща задача. Да разгледаме примера, където трябва да се намери сума от всички числа от едно до 100. Можем да завъртим последователно от 1 до 100 и да ги добавим накрая. Друга възможност е чрез разделяне и завладяване. При този метод можем да групираме числата по такъв начин, че всяка група да има точно два елемента. И накрая, можем да присвоим тази група на пул от нишки. Следователно всяка нишка връща частична сума паралелно и след това събира тези частични суми и ги добавя, за да получи цялата сума.

моите SQL уроци за начинаещи



Характеристики на Callable и Future Class

  • Извикващият клас е интерфейс от тип SAM и следователно може да бъде реализиран в ламбда израза.

  • Извикващият клас има само един метод “call ()”, който съдържа целия код, необходим за асинхронно изпълнение.

  • В среда на интерфейс, който може да се изпълни, нямаше възможност да се върне резултатът от изчислението или да се хвърли отметнатото изключение. Докато с Callable връща стойност и хвърля отметнато изключение е налице.

    какво е обект на скенер
  • Методът Get () от клас Future може да се използва за извличане на резултати, след като изчислението приключи. Потребителите могат също така да проверят дали изчислението е завършено или не чрез метода done ().

  • Отмяната на изчислението чрез метода future.cancel () също е благодат за някои приложения.

  • Get () се нарича блокиращо повикване и продължава да блокира, докато изчислението не завърши.

Сравнение на извикващи се и изпълними класове

Извиква се Изпълним
Той е част от „ java.util.concurrent ' пакет от Java 1.5Той е част от пакета java.lang от Java 1.0
Параметризиран интерфейс, като CallableНепараметризиран интерфейс
Възможност за хвърляне на проверено изключениеНе може да хвърли отметка за изключение
Той съдържа един метод, call (), който връща Тип V, това е същото като дефинирания параметър на интерфейса „Тип“Тук той съдържа един метод, наречен run (), който връща void

По-долу е даден прост пример за извикващ се клас Java, при който кодът връща името на конкретната нишка, която изпълнява задачата след една секунда. Тук използваме рамката на екстрактора, за да изпълним 100 задачи паралелно с Java Future към резултата от изпратените задачи. Първият фрагмент е изходът, а по-долу представя кода.

пакет com.journaldev.threads import java.util.ArrayList import java.util.Date import java.util.List import java.util.concurrent.Callable import java.util.concurrent.ExecutionException import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService import java.util.concurrent.ExecutorService .util.concurrent.Executors импортира java.util.concurrent.Future публичен клас MyCallable реализира Callable {@Override public String call () хвърля изключение {Thread.sleep (1000) // връща името на нишката, изпълняващо тази извикваща задача return Thread.currentThread () .getName ()} public static void main (String args []) {// Вземете ExecutorService от клас помощна програма Executors, размерът на пула от нишки е 10 ExecutorService executor = Executors.newFixedThreadPool (10) // създаване на списък за задържане на бъдещето обект, свързан с Callable Listlist = нов ArrayList() // Създаване на екземпляр MyCallable Callable callable = new MyCallable () for (int i = 0 i<100 i++){ //submit Callable tasks to be executed by thread pool Future future = executor.submit(callable) //add Future to the list, we can get return value using Future list.add(future) } for(Future fut : list){ try { //print the return value of Future, notice the output delay in console // because Future.get() waits for task to get completed System.out.println(new Date()+ '::'+fut.get()) } catch (InterruptedException | ExecutionException e) { e.printStackTrace() } } //shut down the executor service now executor.shutdown() } } 

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

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

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

Има три начина за извикване на изключване:

кога да използвам тази java
  • изключване на празнотата () - Това инициира организирано спиране, при което се изпълняват предварително изпратени задачи, но не се приемат нови задачи.
  • Спиране на списъка Сега () - Той се опитва да спре всички активно изпълняващи се задачи, спира обработката на чакащите задачи и също така връща списък със задачите, които са чакали изпълнение.
  • void awaitTermination () - Това продължава да се блокира, докато всички задачи завършат изпълнението след заявка за изключване или настъпи времето за изчакване. Той също така блокира, когато текущата нишка е прекъсната. Всичко зависи от това коя задача е на първо място.

С това стигаме до края на статията за извикваем интерфейс в Java. Надявам се, че сте разбрали бъдещия и извикващ се интерфейс в Java.

Вижте от Edureka, доверена компания за онлайн обучение с мрежа от над 250 000 доволни учащи, разпространени по целия свят. Курсът за обучение и сертифициране на Java J2EE и SOA на Edureka е предназначен за студенти и професионалисти, които искат да бъдат Java Developer.

Имате въпрос към нас? Моля, споменете го в раздела за коментари на този блог „Извикваем интерфейс в Java“ и ние ще се свържем с вас възможно най-скоро.