Giới thiệu về CompletableFuture trong Java

Trong bài viết trước, mình đã giới thiệu với các bạn về đối tượng Future trong Java và mình cũng đã nói với các bạn rằng khi sử dụng phương thức get() của đối tượng Future, chương trình của chúng ta sẽ bị block cho đến khi tất cả các tác vụ hoàn thành. Để giải quyết vấn đề block chương trình này, từ phiên bản 8, Java giới thiệu đối tượng CompletableFuture giúp chúng ta giải quyết vấn đề này. Cụ thể như thế nào? Hãy cùng tìm hiểu với mình trong bài viết này nhé!

Để dễ so sánh giữa đối tượng Future và đối tượng CompletableFuture, mình sẽ làm ví dụ với đối tượng Future trước.

Đối tượng Callable của mình sẽ có nội dung như sau:

Các bạn để ý là trong phương thức call() của đối tượng Callable, mình đang sleep 3s để demo cho việc xử lý lâu của Thread.

Bây giờ mình sẽ viết một main class sử dụng đối tượng Future. Code của class này như sau:

Khi chạy ví dụ này, các bạn sẽ thấy sau 3s chúng ta sẽ nhận được kết quả rồi mới in kết quả ra được và dòng “End..” cũng mới được output:

Giới thiệu về CompletableFuture trong Java

Bây giờ, mình sẽ sử dụng đối tượng CompletableFuture để chương trình của chúng ta không bị block như vậy nữa và cũng nhận được kết quả như khi sử dụng với đối tượng Future.

Đầu tiên, chúng ta cần phải submit đối tượng Calculator vào một Thread khác trước. CompletableFuture có nhiều methods khác nhau giúp chúng ta làm việc này. Trong bài viết này, mình sẽ sử dụng phương thức supplyAsync(), phương thức này sẽ giúp chúng ta có thể lấy được kết quả sau khi hoàn thành tác vụ.

Tham số của phương thức supplyAsync() là một đối tượng Supplier nên chúng ta cần sửa lại đối tượng Calculator thành một đối tượng implement interface Supplier.

Và lúc này trong main class chúng ta không cần phải sử dụng Executor Framework nữa bởi vì CompletableFuture sẽ thực hiện tác vụ của chúng ta trong một Thread khác rồi. Main class chúng ta lúc này có thể viết lại như sau:

Để có thể lấy kết quả sau khi thực hiện xong tác vụ trong phương thức get() của đối tượng Calculator và in kết quả ra console, mình sẽ sử dụng phương thức thenAccept() của CompletableFuture với tham số là một đối tượng Consumer lưu giữ giá trị sau khi tác vụ được xử lý xong.

Code của main class lúc này sẽ như sau:

Khi chạy đoạn code trên, các bạn sẽ thấy dòng “End…” sẽ được in ra trước. Sau 3s, sau khi xử lý xong tác vụ, kết quả được trả về và gán cho biến result. Lúc này, kết quả cũng sẽ được in ra.

Giới thiệu về CompletableFuture trong Java

Rõ ràng các bạn thấy, chương trình của chúng ta không còn bị block nữa.

 

3/5 - (1 bình chọn)

Add Comment