在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。、
Executor框架包括:线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。
线程池提供了一个线程队列,队列中保存着所有等待状态的线程;
避免了创建与销毁线程的额外开销,提高了响应速度;
线程池的体系结构
java.util.concurrent.Executor: 负责线程的使用和调度的根接口;ExecutorService: 子接口,线程池的主要接口;ThreadPoolExecutor: 线程池的实现类;ScheduledExecutorService: 子接口,负责线程的调度;ScheduledThreadPoolExecutor: 继承了线程池的实现类,实现了负责线程调度的子接口;
工具类:
Executors
ExecutorService newFixedThreadPool(): 创建固定大小的线程池;ExecutorService newCachedThreadPool(): 缓存线程池,线程池中线程的数量不固定,可以根据需求自动更改数量;ExecutorService newSingleThreadExecutor(): 创建单个线程池, 线程池中只有一个线程;ScheduledExecutorService newScheduledThreadPool(): 创建固定大小的线程,可以延时或定时的执行任务;
public class TestThreadPool{public static void main(String[] args){ // 1、创建线程池 ExecutorService pool = Executors.newFixedThreadPool(5); ThreadPoolDemo tpd = new ThreadPoolDemo(); // 2、为线程池中线程分配任务 // submit(Callable