İçinde Java , Gelecek bir arayüz ait olduğu java.util.concurrent paket . Eşzamansız bir hesaplamanın sonucunu temsil etmek için kullanılır. Arayüz, hesaplamanın tamamlanıp tamamlanmadığını kontrol etme, tamamlanmasını bekleme ve hesaplama sonucunu alma yöntemlerini sağlar. Görev veya hesaplama tamamlandıktan sonra hesaplama iptal edilemez.
Sözdizimi:
public interface Future
Java Geleceği Örneği
Java Future'ın en iyi örneği YöneticiHizmet arayüz. Bir veya daha fazla eşzamansız görevin ilerlemesini izlemek için bir Gelecek (bazı yöntemlerinden) nesnesi üretir.
Geleceğin Arayüzünün Yöntemleri
Arayüz aşağıdaki beş yöntemi sağlar:
Yöntem | Tanım |
---|---|
iptal etmek() | Görevin yürütülmesini iptal etmeye çalışır. |
elde etmek() | Yöntem gerekirse hesaplamanın tamamlanmasını bekler ve ardından sonucunu alır. |
elde etmek() | Gerekirse hesaplamanın tamamlanması için en fazla verilen süre kadar bekler ve ardından varsa sonucunu alır. |
iptal edildi() | Görev tamamlanmadan önce iptal edilirse true değerini döndürür. |
bitti() | Görev tamamlanırsa true değerini döndürür. |
Future arayüzünde aşağıdaki gibi bazı eksiklikler vardı:
- Future kullanıldığında hesaplama manuel olarak tamamlanamaz.
- Komutasyon tamamlandığında bildirim yapmaz.
- Zinciri oluşturulamaz ve birleştirilemez.
Yukarıdaki sınırlamaların üstesinden gelmek için, Java 8 tanıtıldı TamamlanabilirGelecek .
Asenkron Programlamada Geleceği Kullanmak
Sonuç Alma
Yukarıda tartıştığımız gibi Gelecek, eşzamansız bir görevin sonucunu temsil eder. Bu eşzamansız görevin sonucunu almak için Java Future arayüzü, her ikisi de bir nesne döndüren get() yöntemlerinin aşağıdaki iki versiyonunu sağlar. Dönüş türünün genel bir tür olabileceğini unutmayın. Örneğin:
Future future = ... // get Future by starting async task // do something else, until ready to check result via Future // get result from Future try { Object result = future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
Not: Eşzamansız görev tamamlanmadan önce get() yöntemini çağırmaya çalışırsak, get() yöntemi sonuç hazır olana kadar engellenecektir.
Yukarıdaki eksikliğin üstesinden gelmek için Future arayüzü, get() yönteminin bir miktar istisnayı hariç tutan başka bir versiyonunu sağlar. zaman (milisaniye cinsinden) parametre olarak. Bu sonuç Gelecekte mevcut olduktan sonra Geleceğin görevi tamamlamak için bir süre bekleyeceğini temsil eder. Örneğin:
try { Object result = future.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { } catch (ExecutionException e) { } catch (TimeoutException e) { // thrown if timeout time interval passes // before a result is available. }
Future'ın belirtilen süre içerisinde herhangi bir sonuç alamaması durumunda, Zaman Aşımı İstisnası Gelecek tarafından atılır.
Eşzamansız Görevi İptal Etme
Ayrıca asenkron bir görevi herhangi bir noktada çağırarak iptal edebiliriz. iptal etmek() Gelecek arayüzünün yöntemi. Örneğin:
Future future = ... // Get Future from somewhere future.cancel();
Eşzamansız Görevin Tamamlanıp Tamamlanmadığını Kontrol Edin
Arayüz bir yöntem sağlar bitti() eşzamansız görevin tamamlanıp tamamlanmadığını kontrol etmek için. Örneğin:
Future future = ... // Get Future from somewhere if(future.isDone()) { Object result = future.get(); } else { // do something else }
Eşzamansız Görevin İptal Edilip İptal Edilmediğini Kontrol Edin
Gelecek arayüzü bir yöntem sağlar iptal edildi() Future tarafından temsil edilen eşzamansız görevin iptal edilip edilmediğini kontrol etmek için. Görev başarıyla iptal edilirse true değerini döndürür, aksi halde false değerini döndürür. Örneğin:
Future future = ... // get Future from somewhere if(future.isCancelled()) { } else { }
Java Geleceği Örneği
FutureExample.java
import java.util.concurrent.*; public class FutureExample { public static void main(String args[]) throws InterruptedException, ExecutionException { //ExecutorService allows us to execute tasks on threads asynchronously ExecutorService es = Executors.newSingleThreadExecutor(); //getting future //the method submit() submits a value-returning task for execution and returns the Future Future future = es.submit(() -> { //sleep thread for 2 seconds Thread.sleep(2000); return 'Welcome to Javatpoint'; }); //checks if the task is completed or not while(!future.isDone()) { System.out.println('The task is still in process.....'); //sleep thread for 2 milliseconds Thread.sleep(200); } System.out.println('Task completed! getting the result'); //getting the result after completing the task String result = future.get(); //prints the result System.out.println(result); es.shutdown(); } }
Çıktı: