ThreadPoolExecutor
ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, // 核心线程数量
4, // 最大线程数量
60, TimeUnit.SECONDS, // 超过核心线程数量的线程,空闲时候的存活时间
new LinkedBlockingQueue<>(), // 等待队列类型
Executors.defaultThreadFactory(), // 默认线程创建工厂,可以执行线程名、线程是否守护线程、优先级
new ThreadPoolExecutor.AbortPolicy()); // 拒绝策略:默认4种(抛异常、直接丢弃、丢弃队列中最老的、让当前线程执行)
executors 线程创建工厂
- Executors.newSingleThreadPool() .单线程的线程池。
- 为什么要有单线程的线程池? 提供了现有的等待队列,也有完整的生命周期。
- Executors.newCacheThreadPool() 队列是synchorizedQuque().核心线程数是0,最大是Integer.max_value;
- Executors.newFixedThreadPool(int coreSize) 核心线程数=最大线程数。队列是linkedBlockingQuque()
- Executors.newScheduledThreadPool(int coreSize) 定时执行的线程池
ForkJoinPool
- 分解汇总任务
- 用很少的线程可以执行很多的任务,TPE做不到先执行子任务
- CPU密集型
- Executors.newWorkStealingThreadPool() 分叉线程池。每一个线程都有自己的等待队列。并且任务轻的可以去poll任务多的线程的等待队列。poll的时候需要加锁。自己取的时候不需要
Callable
类似于Runable的接口,但是有返回。
FutureTask
实现了runable和future。所以即可以当作runable,丢到thread中运行,也可以用get()方法取到运行的返回
CompleteFuture
可以批量管理多个线程的返回。
public class CompletableFutureTest {
public static void main(String[] args) {
CompletableFuture<String> cf1 = CompletableFuture.supplyAsync(() -> test("cf1"));
CompletableFuture<String> cf2 = CompletableFuture.supplyAsync(() -> test("cf2"));
CompletableFuture<String> cf3 = CompletableFuture.supplyAsync(() -> test("cf3"));
CompletableFuture.anyOf(cf1, cf2, cf3).join();
System.out.println("any future is end");
CompletableFuture.allOf(cf1, cf2, cf3).join();
System.out.println("all future is end");
CompletableFuture.supplyAsync(() -> test("cf4"))
.thenApply(str -> "print " + str)
.thenAccept(System.out::println);
ThreadUtils.sleep(5000);
}
private static String test(String key){
ThreadUtils.randomSleep();
System.out.println("this is " + key);
return key;
}
}