【线程】三、线程池

本文深入探讨了Java中的线程池实现,包括ThreadPoolExecutor的参数配置及其拒绝策略。讲解了单线程池、缓存线程池、固定线程池和定时线程池的使用场景。同时,介绍了ForkJoinPool如何通过任务分解提高效率,尤其适合CPU密集型任务。此外,还提到了Callable和FutureTask接口以及CompletableFuture的使用,展示了如何管理和组合多个异步任务的返回结果。
摘要由CSDN通过智能技术生成

ThreadPoolExecutor

ThreadPoolExecutor tpe = new ThreadPoolExecutor(2,  // 核心线程数量
                4,                                      // 最大线程数量
                60, TimeUnit.SECONDS,                     // 超过核心线程数量的线程,空闲时候的存活时间
                new LinkedBlockingQueue<>(),                            // 等待队列类型
                Executors.defaultThreadFactory(),                   // 默认线程创建工厂,可以执行线程名、线程是否守护线程、优先级
                new ThreadPoolExecutor.AbortPolicy());              // 拒绝策略:默认4种(抛异常、直接丢弃、丢弃队列中最老的、让当前线程执行)

executors 线程创建工厂

  1. Executors.newSingleThreadPool() .单线程的线程池。
    1. 为什么要有单线程的线程池? 提供了现有的等待队列,也有完整的生命周期。
  2. Executors.newCacheThreadPool() 队列是synchorizedQuque().核心线程数是0,最大是Integer.max_value;
  3. Executors.newFixedThreadPool(int coreSize) 核心线程数=最大线程数。队列是linkedBlockingQuque()
  4. Executors.newScheduledThreadPool(int coreSize) 定时执行的线程池
  5.  

 

ForkJoinPool

  • 分解汇总任务
  • 用很少的线程可以执行很多的任务,TPE做不到先执行子任务
  • CPU密集型
  1. 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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值