Рубрики
Без рубрики

Пример Вызываемого Java в Будущем

Вызываемый пример Java, пример будущего Java. Отправьте вызываемые объекты интерфейса в пул потоков ExecutorService из платформы исполнителя, которая возвращает Future.

Автор оригинала: Pankaj Kumar.

Вызываемая и будущая Java часто используются в многопоточном программировании. В последних нескольких постах мы многое узнали о потоках java , но иногда нам хочется, чтобы поток мог возвращать какое-то значение, которое мы могли бы использовать. Представлена Java 5 java.util.concurrent.Вызываемый интерфейс в пакете параллелизма, который похож на выполняемый интерфейс, но может возвращать любой объект и может выдавать исключение.

Вызываемый Java

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

Будущее Java

Вызываемые задачи Java возвращают java.util.concurrent.Будущее Объект. Используя Java Future object, мы можем узнать статус вызываемой задачи и получить возвращенный объект. Он предоставляет метод get () , который может дождаться завершения вызываемого объекта, а затем вернуть результат.

Java Future предоставляет cancel() метод для отмены связанной вызываемой задачи. Существует перегруженная версия метода get (), в которой мы можем указать время ожидания результата, это полезно, чтобы избежать блокировки текущего потока на более длительное время. Существуют Выполнено() и Отменено() методы для определения текущего состояния связанной вызываемой задачи.

Вот простой пример вызываемой задачи Java, которая возвращает имя потока, выполняющего задачу через одну секунду. Мы используем платформу Executor для параллельного выполнения 100 задач и используем Java Future для получения результата представленных задач.

package 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;

public class MyCallable implements Callable {

    @Override
    public String call() throws Exception {
        Thread.sleep(1000);
        //return the thread name executing this callable task
        return Thread.currentThread().getName();
    }
    
    public static void main(String args[]){
        //Get ExecutorService from Executors utility class, thread pool size is 10
        ExecutorService executor = Executors.newFixedThreadPool(10);
        //create a list to hold the Future object associated with Callable
        List> list = new ArrayList>();
        //Create MyCallable instance
        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();
    }

}

Как только мы выполним вышеуказанную программу, вы заметите задержку в выводе, потому что метод java Future get() ожидает завершения вызываемой задачи java. Также обратите внимание, что есть только 10 потоков, выполняющих эти задачи.

Вот фрагмент вывода вышеприведенной программы.

Mon Dec 31 20:40:15 PST 2012::pool-1-thread-1
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-2
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-3
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-4
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-5
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-6
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-7
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-8
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-9
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-10
Mon Dec 31 20:40:16 PST 2012::pool-1-thread-2
...

Совет : Что делать, если мы хотим переопределить некоторые методы будущего интерфейса Java, например, переопределить get() метод для тайм-аута по истечении некоторого времени по умолчанию, а не ждать бесконечно, в этом случае Java FutureTask класс пригодится, что является базовой реализацией будущего интерфейса. Ознакомьтесь с примером |/Java FutureTask , чтобы узнать больше об этом классе.