线程池(Thread Pool)是一种并发编程中常用的技术,用于管理和重用线程。它由线程池管理器、工作队列和线程池线程组成。
线程池的基本概念是,在应用程序启动时创建一定数量的线程,并将它们保存在线程池中。当需要执行任务时,从线程池中获取一个空闲的线程,将任务分配给该线程执行。当任务执行完毕后,线程将返回到线程池,可以被其他任务复用。
线程池的设计思想是为了避免频繁地创建和销毁线程的开销,以及控制并发执行的线程数量,从而提高系统的性能和资源利用率。
线程池的关键组成部分包括:
线程池管理器(ThreadPoolExecutor):负责创建、管理和控制线程池。它负责线程的创建、销毁和管理,以及线程池的状态监控和调度任务。工作队列(BlockingQueue):用于存储待执行的任务。当线程池中的线程都在执行任务时,新的任务会被放入工作队列中等待执行。线程池线程(Worker Thread):实际执行任务的线程。线程池中会维护一组线程,这些线程可以被重复使用,从而避免了频繁创建和销毁线程的开销。
核心参数的作用:
corePoolsize 为线程池的基本大小。maximumPoolsize 为线程池最大线程大小。keepAliveTime 和 unit 则是线程空闲后的存活时间。workqueue 用于存放任务的阻塞队列。handler 当队列和最大线程池都满了之后的拒绝策略,
首先,所有任务的调度都是出execute方法完成的,这部分完成的工作是:检查现在线程池的运行状态、运行线程数、运行策略,决定接下来执行的流程,是直接申请线程执行,或是缓冲到队列中执行,亦或是直接拒绝该任务。其执行过程如下:
线程池的运行机制如下:
首先检测线程池运行状态,如果不是RUNNING,则直接拒绝,线程池要保证在RUNNING的状态下执行任务。如果workerCount
线程池的优点包括重用线程、控制并发度、提供线程管理和监控等。通过适当地配置线程池的大小和任务队列的容量,可以充分利用系统资源,提高程序的性能和响应速度。同时,线程池可以避免线程创建和销毁的开销,减少了资源的浪费。
线程池的主要优点包括:重用线程:线程池会在内部维护一组可重用的线程,避免了频繁地创建和销毁线程的开销,提高了线程的利用率。控制并发度:线程池可以限制并发执行的线程数量,防止系统过载。通过调整线程池的大小,可以控制并发度,避免资源消耗过大。提供线程管理和监控:线程池提供了一些管理和监控机制,例如线程池的创建、销毁、线程状态的监控等,方便开发人员进行线程的管理和调试。提供任务队列:线程池通常会使用任务队列来存储待执行的任务,这样可以实现任务的缓冲和调度。
线程池的一些缺点包括:
需要合理配置:线程池的性能和效果受到配置参数的影响,需要根据具体的应用场景和硬件环境来合理配置线程池的大小、任务队列的大小等参数。可能引发资源泄露:如果线程池中的线程长时间闲置而不被使用,可能会导致资源的浪费和泄露。可能引发死锁:在使用线程池时,如果任务之间存在依赖关系,可能会引发死锁问题,需要额外的注意和处理。
使用线程池的一般步骤如下:
创建线程池:使用Executors类提供的静态方法之一,或者直接使用ThreadPoolExecutor类来创建线程池。
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建固定大小的线程池
```
提交任务:使用execute()或submit()方法将任务提交给线程池。
executor.execute(new MyRunnable()); // 提交Runnable任务
Future
```
关闭线程池:在不再需要线程池时,需要调用shutdown()方法来关闭线程池。这将停止接受新任务,并逐渐关闭线程池中的线程。
executor.shutdown();
```
线程池的创建规则:
工作中就是需要以new ThreadPoolExecutor的方式创建线程池的,其余的不安全
线程池的三大方法:
线程池的七大参数:
ThreadPoolExecutor()