Java中實現並行請求兩種方式

碼農談IT發表於2023-12-14

來源:coderidea

在Java中實現並行請求通常涉及到多執行緒或者併發工具類的使用。以下是兩種常見的並行請求模板:一種使用 ExecutorService 來管理執行緒池,另一種使用 Java 8 引入的 CompletableFuture

使用 ExecutorService 實現並行請求

以下是一個使用 ExecutorService 建立固定大小執行緒池,併發執行多個任務的模板:

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ParallelRequestExecutor {    public void executeTasks(List<Runnable> tasks, int timeoutInSeconds) {        ExecutorService executorService = Executors.newFixedThreadPool(tasks.size());        try {            // 提交所有任務到執行緒池            for (Runnable task : tasks) {                executorService.submit(task);            }            // 關閉執行緒池,不再接受新任務            executorService.shutdown();            // 等待所有任務完成,或超時            if (!executorService.awaitTermination(timeoutInSeconds, TimeUnit.SECONDS)) {                executorService.shutdownNow(); // 超時後強制關閉            }        } catch (InterruptedException e) {            executorService.shutdownNow();            Thread.currentThread().interrupt(); // 保持中斷狀態        }    }}

使用 CompletableFuture 實現並行請求

另一種方法是使用 CompletableFuture,這是Java 8引入的一個強大的併發工具,可以方便地處理非同步程式設計問題。

import java.util.List;import java.util.concurrent.CompletableFuture;import java.util.stream.Collectors;public class ParallelRequestExecutor {    public void executeTasks(List<Runnable> tasks) {        List<CompletableFuture<Void>> futures = tasks.stream()            .map(task -> CompletableFuture.runAsync(task))            .collect(Collectors.toList());        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();    }}

在這個示例中, CompletableFuture.runAsync 將每個任務非同步地提交到 ForkJoinPool.commonPool() 中執行。然後 CompletableFuture.allOf 用於等待所有任務的完成。

注意事項

  • 在使用執行緒池時,合理配置執行緒池的大小是非常重要的。執行緒池大小應該根據任務的型別和系統資源來決定。

  • CompletableFuture 提供了豐富的API來處理非同步任務,包括異常處理、結果轉換等。

  • 在任何情況下,確保正確處理異常和執行緒中斷,以避免資源洩露或其他潛在問題。

  • 對於 I/O 密集型任務(如HTTP請求),可以考慮使用比CPU核心數更多的執行緒;對於計算密集型任務,則通常設定執行緒數與CPU核心數相同。

這些並行請求模板可以根據您的具體需求進行調整和最佳化。

來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024924/viewspace-3000041/,如需轉載,請註明出處,否則將追究法律責任。

相關文章