Peningkatan API Java 9 CompletableFuture

1. Pengenalan

Java 9 hadir dengan beberapa perubahan pada kelas CompletableFuture . Perubahan seperti itu diperkenalkan sebagai sebahagian dari JEP 266 untuk menangani aduan dan cadangan umum sejak diperkenalkan di JDK 8, lebih khusus, sokongan untuk kelewatan dan waktu tunggu, sokongan yang lebih baik untuk subkelas dan beberapa kaedah utiliti.

Secara kod, API dilengkapi dengan lapan kaedah baru dan lima kaedah statik baru. Untuk membolehkan penambahan tersebut, kira-kira, 1500 dari 2400 baris kod telah diubah (seperti Open JDK).

2. Penambahan API Instance

Seperti disebutkan, API contoh dilengkapi dengan lapan penambahan baru, yaitu:

  1. Pelaksana lalaiExecutor ()
  2. SelesaiFuture baruIncompleteFuture ()
  3. Salinan Masa Depan Selesai ()
  4. Penyelesaian Tahap minimumCompletionStage ()
  5. SelesaiFuture lengkapAsync (Pembekal pembekal, pelaksana pelaksana)
  6. SelesaiFuture lengkapAsync (Pembekal pembekal)
  7. SelesaiFuture atau Timeout (timeout lama, unit TimeUnit)
  8. SelesaiFuture lengkapOnTimeout (nilai T, jangka masa panjang, unit TimeUnit)

2.1. Kaedah lalaiExecutor ()

Tandatangan : Pelaksana lalaiExecutor ()

Mengembalikan Pelaksana lalai yang digunakan untuk kaedah asinkron yang tidak menentukan Pelaksana .

new CompletableFuture().defaultExecutor()

Ini boleh ditolak oleh subkelas yang mengembalikan pelaksana yang menyediakan, sekurang-kurangnya, satu utas bebas.

2.2. Kaedah baruIncompleteFuture ()

Tandatangan : SelesaiFuture baruIncompleteFuture ()

The NewIncompleteFuture , juga dikenal sebagai "konstruktor maya", digunakan untuk mendapatkan contoh masa depan baru yang dapat diselesaikan dengan jenis yang sama.

new CompletableFuture().newIncompleteFuture()

Kaedah ini sangat berguna ketika subclass CompletableFuture , terutamanya kerana ia digunakan secara dalaman dalam hampir semua kaedah mengembalikan CompletionStage baru , yang memungkinkan subkelas untuk mengawal subtipe apa yang dikembalikan dengan kaedah tersebut.

2.3. Salinan kaedah ()

Tandatangan : Salinan Masa Depan Selesai ()

Kaedah ini mengembalikan CompletableFuture baru yang:

  • Apabila ini selesai dengan normal, yang baru akan selesai juga
  • Apabila ini selesai dengan pengecualian X, yang baru juga diselesaikan dengan pengecualian dengan PenyelesaianException dengan X sebagai penyebabnya
new CompletableFuture().copy()

Kaedah ini mungkin berguna sebagai bentuk "penyalinan defensif", untuk mencegah klien menyelesaikan, sementara masih dapat mengatur tindakan bergantung pada contoh tertentu dari CompletableFuture .

2.4. Kaedah minimumCompletionStage ()

Tandatangan : Penyelesaian Tahap minimumCompletionStage ()

Kaedah ini mengembalikan CompletionStage baru yang berperilaku dengan cara yang sama seperti yang dijelaskan oleh kaedah penyalinan, namun, contoh baru tersebut melemparkan UnsupportedOperationException dalam setiap percubaan untuk mengambil atau menetapkan nilai yang telah diselesaikan.

new CompletableFuture().minimalCompletionStage()

CompletableFuture baru dengan semua kaedah yang ada dapat diambil dengan menggunakan kaedah toCompletableFuture yang tersedia di CompletionStage API.

2.5. Kaedah selesaiAsync ()

The completeAsync kaedah boleh digunakan untuk melengkapkan CompletableFuture asynchronously menggunakan nilai yang diberikan oleh Pembekal disediakan.

Tandatangan :

CompletableFuture completeAsync(Supplier supplier, Executor executor) CompletableFuture completeAsync(Supplier supplier)

Perbezaan antara dua kaedah yang terlalu banyak ini adalah adanya argumen kedua, di mana Pelaksana yang menjalankan tugas dapat ditentukan. Sekiranya tidak ada yang disediakan, pelaksana lalai (dikembalikan dengan kaedah defaultExecutor ) akan digunakan.

2.6. Kaedah atau Timeout ()

Tandatangan : SelesaiFuture atauTimeout (jangka masa panjang, unit TimeUnit)

new CompletableFuture().orTimeout(1, TimeUnit.SECONDS)

Ketetapan yang CompletableFuture sangat dengan TimeoutException , melainkan jika ia diselesaikan sebelum tamat masa yang dinyatakan.

2.7. Kaedah selesaiOnTimeout ()

Tandatangan : SelesaiFuture lengkapOnTimeout (nilai T, jangka masa panjang, unit TimeUnit)

new CompletableFuture().completeOnTimeout(value, 1, TimeUnit.SECONDS)

Melengkapkan Future Selesai secara normal dengan nilai yang ditentukan melainkan ia selesai sebelum tamat waktu yang ditentukan.

3. Penambahan API Statik

Beberapa kaedah utiliti juga ditambahkan. Mereka adalah:

  1. Executor tertundaExecutor (penundaan panjang, unit TimeUnit, pelaksana pelaksana)
  2. Executor tertundaExecutor (kelewatan lama, unit TimeUnit)
  3. CompletionStage completedStage(U value)
  4. CompletionStage failedStage(Throwable ex)
  5. CompletableFuture failedFuture(Throwable ex)

3.1. Methods delayedExecutor

Signatures:

Executor delayedExecutor(long delay, TimeUnit unit, Executor executor) Executor delayedExecutor(long delay, TimeUnit unit)

Returns a new Executor that submits a task to the given base executor after the given delay (or no delay if non-positive). Each delay commences upon invocation of the returned executor's execute method. If no executor is specified the default executor (ForkJoinPool.commonPool()) will be used.

3.2. Methods completedStage and failedStage

Signatures:

 CompletionStage completedStage(U value)  CompletionStage failedStage(Throwable ex)

This utility methods return already resolved CompletionStage instances, either completed normally with a value (completedStage) or completed exceptionally (failedStage) with the given exception.

3.3. Method failedFuture

Signature: CompletableFuture failedFuture(Throwable ex)

The failedFuture method adds the ability to specify an already completed exceptionally CompleatebleFuture instance.

4. Example Use Cases

Within this section, one will show some examples on how to use some of the new API.

4.1. Delay

This example will show how to delay the completion of a CompletableFuture with a specific value by one second. That can be achieved by using the completeAsync method together with the delayedExecutor.

CompletableFuture future = new CompletableFuture(); future.completeAsync(() -> input, CompletableFuture.delayedExecutor(1, TimeUnit.SECONDS));

4.2. Complete With Value on Timeout

Another way to achieve a delayed result is to use the completeOnTimeout method. This example defines a CompletableFuture that will be resolved with a given input if it stays unresolved after 1 second.

CompletableFuture future = new CompletableFuture(); future.completeOnTimeout(input, 1, TimeUnit.SECONDS);

4.3. Timeout

Another possibility is timing out which resolves the future exceptionally with TimeoutException. For example, having the CompletableFuture timing out after 1 second given it is not completed before that.

CompletableFuture future = new CompletableFuture(); future.orTimeout(1, TimeUnit.SECONDS);

5. Conclusion

Kesimpulannya, Java 9 hadir dengan beberapa penambahan pada CompletableFuture API, kini mempunyai sokongan yang lebih baik untuk subkelas, berkat konstruktor mayaIncompleteFuture yang baru , adalah mungkin untuk mengambil alih contoh-contoh CompletionStage yang dikembalikan di sebahagian besar API CompletionStage .

Ia tentunya mempunyai sokongan yang lebih baik untuk kelewatan dan waktu tunggu seperti yang ditunjukkan sebelumnya. Kaedah utiliti yang ditambahkan mengikuti corak yang masuk akal, memberikan cara Lengkap untuk menyelesaikan masalah yang dapat diselesaikan.

Contoh yang digunakan dalam artikel ini terdapat di repositori GitHub kami.