引语
在学习了线程与多线程的相关知识后,我们已经能够实现在程序中使多个任务并行,但是我们在操作时候,往往每执行一个的任务就需要创建一个新的线程。这种方式在需要执行任务很多时不利于我们对线程的管理,且创建过多线程也非常占用资源,那么有没有一种方便我们管理线程,控制线程数量导致的资源占用,又能高效处理任务的方式呢?
在Java中,针对频繁创建线程导致的资源浪费、管理复杂的问题,线程池可以说是最优解决方案。顾名思义,它就像人工养殖的线程池塘,可以帮助我们很好的管理线程的创建和执行。
组成
关于线程池是如何实现线程高效管理的,我们不妨先来解析一下线程池的结构,线程池大致可以分为:线程管理器、工作线程、工作队列三个部分
线程管理器:线程创建,回收,处理的管理器,是操作线程池内线程的主要部分
工作线程:实际执行任务的线程,包括核心线程和临时线程
工作队列:存储待处理任务的阻塞队列,工作线程会从这里取出任务执行
执行原理
通过线程管理器、工作线程、工作队列三个部分协同工作,线程池就能够实现高效工作,具体实现原理如下:
线程池在使用时,首先会接收任务对象,放入任务队列当中,如果工作线程中存在空闲的线程,那么空闲的工作线程会取出任务队列中的任务并执行。
而工作线程中的线程分为两种,核心线程和临时线程,核心线程是工作线程中始终存活的线程,线程管理器会在初始化时就创建好核心线程。而临时线程是在核心线程已满且任务队列也满的情况下创建的线程,临时线程在一段时间没有接到任何任务后会被线程管理器自行关闭,防止占用不必要的系统资源。
且核心线程数与临时线程数之和不得超过最大线程数,防止占用的资源过多导致出现问题。
官方实现
Java官方给出了 ThreadPoolExecutor 类作为实现线程池的实现类,我们来看看它的使用方法:
//构造方法
public ThreadPoolExecutor(int corePoolSize, //线程池核心线程数量int maximumPoolSize, //线程池最大线程数量long keepAliveTime, //指定临时线程的存活时间TimeUnit unit, //临时线程存活的时间单位SlockingQueue<Runnable> workQueue, //指定线程池的任务队列ThreadFactory threadfactory, //指定线程池的线程工厂RejectedExecutionHandler handler //线程池的任务拒绝策略
);
//任务提交
public void execute(Runnable r);