Looking for java Keywords? Try Ask4Keywords

Java Language Вызов и будущее


пример

Хотя Runnable предоставляет средство для переноса кода, который должен выполняться в другом потоке, он имеет ограничение в том, что он не может вернуть результат выполнения. Единственный способ получить некоторое возвращаемое значение из выполнения Runnable - это присвоить результат переменной, доступной в области вне Runnable .

Callable была представлена ​​на Java 5 как одноранговое средство Runnable . Callable по сути Callable и та же, за исключением того, что вместо run метод call . Метод call имеет дополнительную возможность возвращать результат, а также разрешено выдавать проверенные исключения.

Результат отправки задания Callable доступен для использования через будущее

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

Интерфейс с возможностью вызова

public interface Callable<V> {
    V call() throws Exception;
}

Будущее

interface Future<V> {
    V get();
    V get(long timeout, TimeUnit unit);
    boolean cancel(boolean mayInterruptIfRunning);
    boolean isCancelled();
    boolean isDone();
}

Использование примера Callable and Future:

public static void main(String[] args) throws Exception {
    ExecutorService es = Executors.newSingleThreadExecutor();
          
    System.out.println("Time At Task Submission : " + new Date());
    Future<String> result = es.submit(new ComplexCalculator());
    // the call to Future.get() blocks until the result is available.So we are in for about a 10 sec wait now
    System.out.println("Result of Complex Calculation is : " + result.get());
    System.out.println("Time At the Point of Printing the Result : " + new Date());
}

Наш Callable, который делает длительные вычисления

public class ComplexCalculator implements Callable<String> {

    @Override
    public String call() throws Exception {
        // just sleep for 10 secs to simulate a lengthy computation
        Thread.sleep(10000);            
        System.out.println("Result after a lengthy 10sec calculation");
        return "Complex Result"; // the result 
    }
}

Выход

Time At Task Submission : Thu Aug 04 15:05:15 EDT 2016
Result after a lengthy 10sec calculation
Result of Complex Calculation is : Complex Result
Time At the Point of Printing the Result : Thu Aug 04 15:05:25 EDT 2016

Другие операции, разрешенные на будущее

Хотя get() - это метод для извлечения фактического результата. Будущее имеет положение

  • get(long timeout, TimeUnit unit) определяет максимальный период времени в течение текущего потока, который будет ждать результата;
  • Для отмены отмены вызова задачи cancel(mayInterruptIfRunning) . Флаг mayInterrupt указывает, что задача должна быть прервана, если она была запущена и работает прямо сейчас;
  • Чтобы проверить, завершена ли задача / завершена вызовом isDone() ;
  • Чтобы проверить, отменена ли длительная задача, isCancelled() .