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



Эта статья предоставит вам подробные и всесторонние знания о том, как реализовать вызываемый интерфейс в Java с примерами.

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

Резюме по темам

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





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

Для Java 5 был представлен класс java.util.concurrent. Этот вызываемый интерфейс был введен через пакет параллелизма, который был похож на интерфейс Runnable. Он также может возвращать любой объект и может вызывать исключение. Интерфейс Java Callable использует Generics, что позволяет возвращать любой тип объекта. Executor Framework предоставляет метод submit () для выполнения вызываемых реализаций в пуле потоков. На самом деле Java Executor Framework придерживается шаблонов WorkerThread.

java-interfaceВ пуле потоков пользователи могут инициировать потоки с помощью метода Executors.newFixedThreadPool (10) и, соответственно, отправлять ему задачу. Runnable действует как цель потока, а общедоступный метод void run () обязательно реализуется для определения задачи. Это будет выполняться потоками в пуле потоков. В зависимости от доступности потоков в пуле Executor Framework назначает работу (выполняемую цель) потокам.Если все потоки используются, задача должна быть остановлена. После того, как поток завершает одну задачу, он возвращается в пул как доступный поток, который готов принять будущие задачи. Callable похож на Runnable и может возвращать любой тип объекта, когда мы хотим получить результат или статус задачи.



php превратить строку в массив

Возврат вызываемого интерфейса

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

Также существуют методы isDone () и isCancelled () для получения текущего статуса связанной задачи Callable. Рассмотрим пример, в котором нужно найти сумму всех чисел от одного до 100. Мы можем последовательно выполнить цикл от 1 до 100 и, наконец, добавить их. Другая возможность - разделение и завоевание. В этом методе мы можем сгруппировать числа таким образом, чтобы в каждой группе было ровно два элемента. Наконец, мы можем назначить эту группу пулу потоков. Следовательно, каждый поток возвращает частичную сумму параллельно, а затем собирает эти частичные суммы и складывает их, чтобы получить всю сумму.



Возможности 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.Executors import 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) // создать список для хранения будущего объект, связанный со списком вызываемыхlist = новый ArrayList() // Создаем экземпляр MyCallable Callable callable = new MyCallable () для (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.

Чтобы сообщить службе-исполнителю, что нет необходимости запускать потоки, мы должны закрыть службу.

Вызвать выключение можно тремя способами:

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

На этом мы подошли к концу статьи «Вызываемый интерфейс в Java». Надеюсь, вы получили представление о Future и Callable Interface в Java.

Проверьте от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Курс обучения и сертификации по Java J2EE и SOA от Edureka предназначен для студентов и профессионалов, которые хотят стать Java-разработчиками.

Есть вопрос к нам? Пожалуйста, укажите это в разделе комментариев в блоге «Вызываемый интерфейс в Java», и мы свяжемся с вами в ближайшее время.