CompletableFuture保證線程同步


目的:多線程執行某些任務,把執行完的結果放到list中,最后返回list。

1、list要保證線程安全

2、要等所有的線程都執行完,才能返回list

3、異常處理,若其中某個線程出現了異常,會導致其線程卡死,必須進行try-catch包裹

package com.thread;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolTest {
    public static  ThreadPoolExecutor pool = new ThreadPoolExecutor(
            5,10,200, TimeUnit.MILLISECONDS,  new ArrayBlockingQueue<Runnable>(10));

    public static void main(String[] args) {
// 寫加鎖,讀不加鎖 List
<String> list = new CopyOnWriteArrayList<>(); List<CompletableFuture> cfs = new ArrayList<>(); for (int i = 0; i < 10; i++) { Map<String, Integer> params = new HashMap<>(); params.put("i", i); CompletableFuture cf = CompletableFuture.runAsync(() -> {
          try { String value
= String.format("thread: %s, i = %s", Thread.currentThread().getName(), params.get("i")); System.out.println(value); list.add(params.get("i").toString());
} catch(Exception e) {
          // 在不能保證代碼一定不會出現異常的情況下,必須進行try-catch處理
} }, pool); cfs.add(cf); }
// 等待所有線程執行完 CompletableFuture.allOf(cfs.toArray(
new CompletableFuture[1])).join(); System.out.println(list); pool.shutdown(); } }

runAsync類似於execute方法,不支持返回值,而supplyAsync方法類似submit方法,支持返回值。

沒有指定Executor的方法會使用ForkJoinPool.commonPool() 作為它的線程池執行異步代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM