Code ví dụ Java Async Await với ea-async và CompletableFuture

Code ví dụ Java Async Await với ea-async và CompletableFuture.

Với Javascript thì việc thực hiện await các tác vụ (các process) rất đơn giản. Còn với Java là ngôn ngữ đa luồng, việc await ở đây là await các thread, muốn thực hiện điều đó ta cần sử dụng thêm thư việc.

Thư viện ea-async cung cấp tính năng async await cho Java. Trong javascript await 1 promise thì trong java await 1 CompletableFuture

(Xem lại: Code ví dụ Java CompletableFuture)

Code ví dụ Java Async Await với ea-async và CompletableFuture.

Tạo maven project:

Code ví dụ Java Async Await với ea-async và CompleteFuture

Thư viện sử dụng:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>stackjava.com</groupId>
  <artifactId>DemoAsyncAwait</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
  </properties>
  <dependencies>
    <dependency>
      <groupId>com.ea.async</groupId>
      <artifactId>ea-async</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>
</project>

Ví dụ Java CompleteFuture:

package stackjava.com.eaasync.demo;

import java.util.concurrent.*;

public class DemoCompleteFuture {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> add(1, 2), executor);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> add(1, 3), executor);
        CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> add(2, 3), executor);

        System.out.println("Done");
        executor.shutdown();
    }


    public static int add(int a, int b) {
        int sum = a + b;
        System.out.println("result: " + a + " + " + b + " = " + sum);
        return sum;
    }
}

kết quả:

result: 1 + 2 = 3
result: 1 + 3 = 4
Done
result: 2 + 3 = 5

Mỗi lần chạy, thứ tự các dòng in ra sẽ khác nhau do chúng chạy trên các thread khác nhau.

Ví dụ Java CompletableFuture với Async Await:

package stackjava.com.eaasync.demo;

import java.util.concurrent.*;

import com.ea.async.Async;

public class DemoAsyncAwait {
    public static void main(String[] args) {
        Async.init();

        ExecutorService executor = Executors.newFixedThreadPool(10);
        CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> add(1,2), executor);
        Async.await(future1);
        CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> add(1,3), executor);
        Async.await(future2);
        CompletableFuture<Integer> future3 = CompletableFuture.supplyAsync(() -> add(2,3), executor);
        Async.await(future3);
        
        System.out.println("Done");
        executor.shutdown();
    }


    public static int add(int a, int b) {
        int sum = a + b;
        System.out.println("result: " + a + " + " + b + " = " + sum);
        return sum;
    }
}

Kết quả:

result: 1 + 2 = 3
result: 1 + 3 = 4
result: 2 + 3 = 5
Done

khi sử dụng Async.await thì nó sẽ chờ cho CompletableFuture thực hiện xong mới tiếp tuc chạy tới dòng code tiếp theo. Do đó tất cả các lần chạy đều cho kết quả như trên.

*Lưu ý:

Async.init(); dùng để enable async/await, bạn chỉ cần gọi hàm này 1 lần duy nhất trong project.

 

(Hướng dẫn sửa lỗi No compatible attachment provider is available)

Okay, Done!

Download code ví dụ trên tại đây. hoặc https://github.com/stackjava/DemoJavaAsyncAwait

 

References:

https://github.com/electronicarts/ea-async

stackjava.com