4.18 每日总结(Java异步通信的几种方法)

1. 线程池(ExecutorService)

线程池是Java中实现异步任务的一种简单方式。通过线程池,可以将任务提交到线程池中执行,而主线程可以继续执行其他任务,从而实现异步处理。

示例代码:

java
复制
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadpoolExample {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(5); // 创建一个固定大小的线程池

        // 提交任务
        executorService.submit(() -> {
            System.out.println("Task is running in thread: " + Thread.currentThread().getName());
            // 模拟任务执行
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Task completed in thread: " + Thread.currentThread().getName());
        });

        // 主线程继续执行
        System.out.println("Main thread is running...");
        executorService.shutdown(); // 关闭线程池
    }
}
 

优点:

  • 简单易用,适合处理简单的异步任务。
  • 可以通过线程池的配置(如线程数量)来优化性能。

缺点:

  • 需要手动管理线程池的生命周期。
  • 不支持复杂的异步流程控制。

2. Future和Callable

FutureCallable是Java中用于异步计算的接口。Callable是一个可以返回结果的任务接口,而Future用于获取异步任务的结果。

示例代码:

java
复制
import java.util.concurrent.*;

public class FutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ExecutorService executorService = Executors.newSingleThreadExecutor();

        // 提交任务
        Future<String> future = executorService.submit(() -> {
            Thread.sleep(2000);
            return "Task completed";
        });

        // 主线程继续执行
        System.out.println("Main thread is running...");

        // 获取异步任务的结果
        String result = future.get(); // 阻塞等待任务完成
        System.out.println("Result: " + result);

        executorService.shutdown();
    }
}
 

优点:

  • 可以获取异步任务的结果。
  • 支持异常处理。

缺点:

  • future.get()是阻塞的,可能会导致主线程等待。
  • 不支持复杂的异步流程控制。

3. CompletableFuture

CompletableFuture是Java 8引入的用于异步编程的类,它继承自Future,提供了更强大的功能,支持链式调用和组合操作。

示例代码:

java
复制
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
            // 模拟异步任务
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "Task completed";
        });

        // 主线程继续执行
        System.out.println("Main thread is running...");

        // 获取异步任务的结果
        String result = future.get(); // 阻塞等待任务完成
        System.out.println("Result: " + result);
    }
}
 

优点:

  • 支持链式调用,可以组合多个异步任务。
  • 提供了丰富的API,如thenApplythenAcceptthenCombine等,用于处理异步任务的结果。
  • 可以通过complete方法手动完成任务。

缺点:

  • 学习曲线较陡,需要理解其复杂的API和回调机制。
posted @ 2025-04-22 09:31  笠大  阅读(18)  评论(0)    收藏  举报