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 более гибок в обработке потоков. Механизм примерно такой: когда один поток работает, в то же время запускается другой поток. Если вам интересно, вы можете узнать больше после занятий.