JAVA 实现异步处理案例
时间: 2024-05-06 13:15:51 浏览: 6
Java 实现异步处理的方式有很多,以下是其中两种比较常见的方式:
1. 使用 Future 和 CompletableFuture
使用 Future 和 CompletableFuture 可以方便地实现异步处理。Future 表示一个异步计算的结果,通过 Future.get() 方法可以获取计算结果,如果计算还没有完成,该方法会阻塞直到计算完成。CompletableFuture 则是对 Future 的增强,可以通过 CompletableFuture.supplyAsync() 或者 CompletableFuture.runAsync() 方法创建异步计算任务,然后通过 CompletableFuture.thenApply()、CompletableFuture.thenAccept()、CompletableFuture.thenRun() 等方法定义任务完成后的操作。
示例代码:
```java
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class AsyncExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
// 模拟一个耗时的计算任务
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 100;
});
// 定义任务完成后的操作
future.thenAccept(result -> System.out.println("计算结果:" + result));
System.out.println("主线程继续执行");
// 阻塞等待计算结果
Integer result = future.get();
System.out.println("计算结果:" + result);
}
}
```
2. 使用线程池和 Callable
使用线程池和 Callable 也可以实现异步处理。Callable 表示一个可以通过调用 call() 方法返回结果的任务,可以通过 ExecutorService.submit() 方法提交任务,该方法会立即返回一个 Future 对象,可以通过该对象获取任务的执行结果。
示例代码:
```java
import java.util.concurrent.*;
public class AsyncExample {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// 模拟一个耗时的计算任务
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 100;
}
});
// 定义任务完成后的操作
future.thenAccept(result -> System.out.println("计算结果:" + result));
System.out.println("主线程继续执行");
// 阻塞等待计算结果
Integer result = future.get();
System.out.println("计算结果:" + result);
executor.shutdown();
}
}
```
注意:使用线程池时需要在程序结束时手动关闭 executor,否则可能会导致程序无法正常退出。