Future<T> درواقع یک اشاره گر به شئی از جنس T است که در حال حاضر موجود نیست (برای مثال محاسبه آن تمام نشده است). مثل کلید یک ماشین می ماند که هنوز ساخته نشده.
استفاده از مفاهیمی مثل Future و Promise بعنوان pattern ثابت شده در برنامه نویسی concurent به سبک asynchronous و Non-blocking در بسیاری از زبان های برنامه نویسی و فریم ورک ها مرسوم است. در جاوا هم اینترفیس Future برای همین سبک برنامه نویسی طراحی شده است. التبه بدلیل مشکلات طراحی که اینترفیس Future داست، CompletableFuture در جاوا 8 معرفی شد. در این سبک برنامه نویسی concurent، متد ها بجای block کردن فرآیند اجرا برنامه در زمان برگرداندن شئ، Future ی از آن شئ بر می گردانند.
private static final ExecutorService pool = Executors.newFixedThreadPool(10);
public static Future<String> startComputation() throws IOException {
return pool.submit(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.currentThread().sleep(3000);
return "finish computation";
}
});
}
public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
final Future<String> contentsFuture = startComputation();
while (!contentsFuture.isDone()) {
System.out.println("computation in progress...");
System.out.println("do another work");
Thread.currentThread().sleep(1000);
}
System.out.println(contentsFuture.get());
System.exit(0);
}
در مثال بالا، متد startComputation برای محاسبه مقدار String بازگشتی نیاز به زمان نامشخص دارد برای همین بجای نوع String، نوع Future<String> بر می گرداند تا برنامه block نشود.