目的:多线程执行某些任务,把执行完的结果放到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() 作为它的线程池执行异步代码。