并发编程领域可以抽象为3个核心问题:分工、协作、互斥。
本文介绍分工。
所谓分工,类似于现实中完成一个项目,项目经理要拆分任务,安排合适的成员去完成。在并发编程领域,线程就是成员,分工直接决定了并发程序的性能。Java并发包里的Executor、Fork/Join、Future本质上都是一种分工方法。除此之外,并发编程领域还总结了一些设计模式,基本上都是和分工方法相关的,例如生产者-消费者、Thread-Per-Message、Worker Thread模式等都是用来指导如何分工的。
线程池
虽然在Java语言中创建线程看上去就像创建一个对象一样简单,只需要new Thread()就可以了,但实际上创建线程远不是创建一个对象那么简单。创建对象,仅仅是在JVM的堆里分配一块内存而已;而创建一个线程,却需要调用操作系统内核的API,然后操作系统要为线程分配一系列的资源,这个成本就很高了,所以线程是一个重量级的对象,应该避免频繁创建和销毁。我们可以使用线程池来避免创建销毁线程的开销。
Java线程池采用的是生产者-消费者模式。线程池的使用方是生产者,线程池本身是消费者。Java提供的线程池相关的工具类中,最核心的是ThreadPoolExecutor。
ThreadPoolExecutor共有7个参数可设置
- corePoolSize 线程池核心线程数
- maximumPoolSize 线程池最大线程池
- keepAliveTime 空闲线程存活时间
- unit 存活时间单位
- workQueue 工作队列
- threadFactory 创建线程的工厂
- handler 拒绝策略
1 | public ThreadPoolExecutor(int corePoolSize, |