
1. Концепция
Future представляет собой результат асинхронной задачи, которая, возможно, не была завершена. К этому результату можно добавить обратный вызов для выполнения соответствующих операций после успешного или неудачного выполнения задачи.
2. Будущий интерфейс
Интерфейс Future определяет пять основных методов интерфейса. RunnableFuture и ScheduleFuture наследуют этот интерфейс, а CompleteFuture и ForkJoinTask наследуют этот интерфейс.
3. Примеры
тест упаковки;
импортировать java.util.concurrent.Callable;
импортировать java.util.concurrent.ExecutionException;
импортировать java.util.concurrent.FutureTask;
публичный класс CallableFutureTest {
public static void main(String[] args) {
длинный startTime = System.currentTimeMillis();
Callable<Integer> CalcableCallable = новый Callable<Integer>() {
@Override
public Integer call() выдает исключение {
// TODO Автоматически сгенерированная заглушка метода
Thread.sleep(2000); // Время моделирования int result = 1+2;
вернуть результат;
}
};
FutureTask<Integer> CalculateFutureTask = новый FutureTask<>(calculateCallable);
Поток t1 = новый поток (calculateFutureTask);
t1.start();
//Теперь присоединитесь к потоку, чтобы запустить трудоемкий сервис, который имитирует удаленные вызовы и полагается на результаты своих вычислений (например, сетевой калькулятор)
пытаться {
//Моделируем трудоемкие задачи, основной поток делает свое дело, отражая преимущества многопоточности Thread.sleep(3000);
интервал а = 3+5;
Целочисленный результат = CalculateFutureTask.get();
System.out.println("result = "+(a+result));//Имитируем результат работы основного потока, опираясь на подпоток long endTime = System.currentTimeMillis();
System.out.println("time = "+(endTime-startTime)+"ms");
} catch (InterruptedException | ExecutionException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
} Как видно из приведенного выше, время, указанное выше, составляет около 3 с. Фактически, это в основном время, затрачиваемое основным потоком на сон (3000). Если мы не используем Future и полагаемся на результаты потока, время, которое нам может понадобиться, может составлять 5 с (подпоток 2 с + основной поток 3 с).
Выше описано, как Future получает результаты потоков в Java. Можно сказать, что Future более гибок в обработке потоков. Механизм примерно такой: когда один поток работает, в то же время запускается другой поток. Если вам интересно, вы можете узнать больше после занятий.