最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中常用的異步方法(核心用法和場景)

 更新時間:2025年12月13日 15:20:51   作者:皮卡龍  
文章介紹了Java中異步編程的各種方法和場景,包括基礎JDK的Thread/Runnable、Future+Callable、CompletableFuture,以及Spring框架中的@Async注解,還討論了異步IO和響應式編程的實現(xiàn)方式,并提供了根據(jù)場景選擇合適異步方法的建議,感興趣的朋友跟隨小編一起看看吧

在 Java 中,異步編程的核心目標是避免主線程阻塞,提升程序并發(fā)性能。以下是 Java 不同版本 / 框架中最常用的異步方法,按「基礎 API→進階框架」的邏輯梳理,附核心用法和場景:

一、基礎 JDK 異步 API(Java 5+)

1. Thread/Runnable(最基礎)

核心邏輯:通過新建線程執(zhí)行異步任務,無返回值。適用場景:簡單異步任務,無需結果、無需線程管理。

// 方式1:直接new Thread
new Thread(() -> {
    // 異步執(zhí)行的任務(如IO操作、耗時計算)
    System.out.println("異步任務執(zhí)行中:" + Thread.currentThread().getName());
}).start();
// 方式2:線程池(推薦,避免頻繁創(chuàng)建線程)
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.submit(() -> {
    // 異步任務
});
// 注意:使用后需關閉線程池(優(yōu)雅關閉)
executor.shutdown();

2. Future + Callable(Java 5+,支持返回值)

核心邏輯Callable 定義有返回值的異步任務,Future 接收結果,支持阻塞獲取 / 超時獲取。適用場景:需要異步任務返回結果,可接受阻塞等待的場景。

ExecutorService executor = Executors.newSingleThreadExecutor();
// 提交Callable任務,返回Future
Future<String> future = executor.submit(() -> {
    Thread.sleep(1000); // 模擬耗時操作
    return "異步任務結果";
});
// 獲取結果(阻塞直到任務完成)
try {
    String result = future.get(); // 阻塞獲取
    // 或超時獲?。篺uture.get(2, TimeUnit.SECONDS);
    System.out.println("結果:" + result);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}

缺點:獲取結果時仍會阻塞,無法鏈式調(diào)用。

3. CompletableFuture(Java 8+,推薦)

核心邏輯:基于「異步回調(diào) + 流式編程」,解決 Future 阻塞問題,支持多任務組合、異常處理、非阻塞回調(diào)。適用場景:復雜異步場景(如多任務串行 / 并行、結果聚合、異步回調(diào)),Java 8 + 首選。

核心用法:

// 1. 異步執(zhí)行無返回值任務
CompletableFuture.runAsync(() -> {
    System.out.println("無返回值異步任務:" + Thread.currentThread().getName());
});
// 2. 異步執(zhí)行有返回值任務(默認使用ForkJoinPool.commonPool())
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    Thread.sleep(1000);
    return "有返回值的異步結果";
});
// 3. 非阻塞回調(diào)(任務完成后處理結果)
future.thenAccept(result -> System.out.println("回調(diào)處理結果:" + result))
      .exceptionally(e -> { // 異常處理
          System.err.println("任務異常:" + e.getMessage());
          return null;
      });
// 4. 多任務組合(并行執(zhí)行后聚合結果)
CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> "任務1");
CompletableFuture<String> task2 = CompletableFuture.supplyAsync(() -> "任務2");
// 等待所有任務完成,聚合結果
CompletableFuture<Void> allDone = CompletableFuture.allOf(task1, task2);
allDone.join(); // 阻塞等待所有任務完成(也可改用thenRun異步處理)
String result = task1.join() + " + " + task2.join();
System.out.println("聚合結果:" + result);
// 5. 指定自定義線程池(避免使用默認公共池)
ExecutorService customPool = Executors.newFixedThreadPool(3);
CompletableFuture.supplyAsync(() -> "自定義線程池執(zhí)行", customPool)
                 .thenRun(() -> System.out.println("完成"))
                 .whenComplete((v, e) -> customPool.shutdown()); // 完成后關閉線程池

二、Spring 框架中的異步方法(Spring 3+)

Spring 通過注解簡化異步開發(fā),核心是@Async。

1. 基礎使用(@Async)

步驟 1:開啟異步支持(配置類 / 啟動類)

@Configuration
@EnableAsync // 開啟異步
public class AsyncConfig {
    // 自定義線程池(可選,默認使用SimpleAsyncTaskExecutor)
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(20);
        executor.setThreadNamePrefix("Async-");
        executor.initialize();
        return executor;
    }
}

步驟 2:定義異步方法

@Service
public class AsyncService {
    // 無返回值異步方法
    @Async
    public void asyncTask() {
        System.out.println("Spring異步任務:" + Thread.currentThread().getName());
    }
    // 有返回值異步方法(返回Future/CompletableFuture)
    @Async
    public CompletableFuture<String> asyncTaskWithResult() {
        try {
            Thread.sleep(1000);
            return CompletableFuture.completedFuture("Spring異步結果");
        } catch (InterruptedException e) {
            return CompletableFuture.failedFuture(e);
        }
    }
}

步驟 3:調(diào)用異步方法

@Autowired
private AsyncService asyncService;
public void testAsync() {
    // 調(diào)用無返回值異步方法
    asyncService.asyncTask();
    // 調(diào)用有返回值異步方法
    CompletableFuture<String> future = asyncService.asyncTaskWithResult();
    future.thenAccept(result -> System.out.println("Spring異步結果:" + result));
}

2. 注意事項

  • 異步方法不能是private/static,且不能在同一個類中調(diào)用(Spring AOP 代理機制);
  • 推薦自定義線程池,避免默認線程池的性能問題;
  • 異常處理:可通過@Async結合CompletableFuture捕獲異常,或自定義AsyncUncaughtExceptionHandler處理無返回值方法的異常。

三、其他常用異步場景

1. 異步 IO(Java NIO 2 / AIO)

適用于高并發(fā) IO 場景(如網(wǎng)絡通信、文件讀寫),核心是AsynchronousFileChannel/AsynchronousSocketChannel

// 異步文件讀取示例
Path path = Paths.get("test.txt");
AsynchronousFileChannel channel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 異步讀取,通過回調(diào)處理結果
channel.read(buffer, 0, null, new CompletionHandler<Integer, Void>() {
    @Override
    public void completed(Integer bytesRead, Void attachment) {
        System.out.println("讀取字節(jié)數(shù):" + bytesRead);
        buffer.flip();
        // 處理讀取的數(shù)據(jù)
    }
    @Override
    public void failed(Throwable exc, Void attachment) {
        exc.printStackTrace();
    }
});

2. 響應式編程(Project Reactor/Spring WebFlux)

適用于非阻塞響應式場景,核心是Mono/Flux

// 異步獲取單個結果
Mono<String> mono = Mono.fromSupplier(() -> {
    Thread.sleep(1000);
    return "Reactor異步結果";
}).subscribeOn(Schedulers.boundedElastic()); // 指定異步線程池
// 訂閱(觸發(fā)執(zhí)行)
mono.subscribe(result -> System.out.println("Reactor結果:" + result));

四、核心選型建議

場景推薦方案
Java 8+ 簡單異步 / 多任務組合CompletableFuture
Spring 項目中的業(yè)務異步@Async + 自定義線程池
高并發(fā) IO(文件 / 網(wǎng)絡)Java AIO / Netty
響應式非阻塞系統(tǒng)Spring WebFlux + Reactor
簡單無返回值異步(低并發(fā))Thread + 線程池

關鍵優(yōu)化點

  • 所有異步場景都應使用線程池(避免頻繁創(chuàng)建線程);
  • 避免異步任務中的阻塞操作(如同步 IO、鎖等待),否則會耗盡線程池;
  • 異步任務必須處理異常(如 CompletableFuture 的 exceptionally、Spring 的異常處理器)。

到此這篇關于Java中常用的異步方法(核心用法和場景)的文章就介紹到這了,更多相關java異步方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot中配置AOP詳解

    SpringBoot中配置AOP詳解

    這篇文章主要介紹了SpringBoot中配置AOP詳解,Spring Boot 在Spring 的基礎上對AOP的配置提供了自動化配置解決方案spring-boot-starter-aop,使開發(fā)者能夠更加便捷地在Spring Boot項目中使用AOP,需要的朋友可以參考下
    2024-01-01
  • 詳解Idea 2019.2 安裝lombok插件失效問題解決

    詳解Idea 2019.2 安裝lombok插件失效問題解決

    這篇文章主要介紹了詳解Idea 2019.2 安裝lombok插件失效問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • java實現(xiàn)在原有日期時間上加幾個月或幾天

    java實現(xiàn)在原有日期時間上加幾個月或幾天

    這篇文章主要介紹了java實現(xiàn)在原有日期時間上加幾個月或幾天,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • idea設置JVM運行參數(shù)的幾種方式

    idea設置JVM運行參數(shù)的幾種方式

    對JVM運行參數(shù)進行修改是JVM性能調(diào)優(yōu)的重要手段,本文主要介紹了idea設置JVM運行參數(shù)的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • SpringCloud使用logback日志框架教程詳解

    SpringCloud使用logback日志框架教程詳解

    Logback是一個功能強大的日志框架,它是一個基于slf4j的日志系統(tǒng),提供了可靠的日志服務,比log4j更快,更靈活,更容易使用。本文將教會你快速讓你的項目集成logback日志框架,需要的朋友可以參考下
    2023-05-05
  • SpringBoot多數(shù)據(jù)源配置完整指南

    SpringBoot多數(shù)據(jù)源配置完整指南

    在復雜的企業(yè)應用中,經(jīng)常需要連接多個數(shù)據(jù)庫,Spring Boot 提供了靈活的多數(shù)據(jù)源配置方式,以下是詳細的實現(xiàn)方案,需要的朋友可以參考下
    2025-04-04
  • 精致小巧的java相冊制作方法

    精致小巧的java相冊制作方法

    這篇文章主要為大家詳細介紹了精致小巧的java相冊制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java面向對象的封裝你了解嗎

    Java面向對象的封裝你了解嗎

    這篇文章主要為大家詳細介紹了Java面向對象的封裝,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • nacos單機本地配置文件存儲位置方式

    nacos單機本地配置文件存儲位置方式

    這篇文章主要介紹了nacos單機本地配置文件存儲位置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java Maven依賴傳遞,可選依賴,排除依賴詳解

    Java Maven依賴傳遞,可選依賴,排除依賴詳解

    這篇文章主要介紹了Java Maven依賴傳遞,可選依賴,排除依賴詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

彰化市| 延庆县| 太仓市| 安溪县| 永嘉县| 白河县| 鄂尔多斯市| 灯塔市| 梧州市| 巩义市| 宜宾市| 木里| 咸宁市| 喀喇沁旗| 耒阳市| 桑植县| 浑源县| 玉环县| 甘孜县| 昔阳县| 克拉玛依市| 云龙县| 宁国市| 兰溪市| 凉城县| 松桃| 镇远县| 桦甸市| 潢川县| 安远县| 常德市| 永嘉县| 曲沃县| 千阳县| 德江县| 吉木乃县| 浦北县| 靖宇县| 板桥市| 万全县| 廉江市|