Java ThreadPoolExecutor 线程池
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ArrayBlockingQueue;public class ThreadPoolExample {public static void main(String[] args) {// 创建线程池对象ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, // 核心线程数3, // 最大线程数1, // 线程空闲时间TimeUnit.MINUTES, // 空闲时间的单位new ArrayBlockingQueue<>(2) // 任务队列);// 提交任务给线程池执行threadPool.execute(new Runnable() {@Overridepublic void run() {// 任务的具体逻辑System.out.println("Task executed by thread: " + Thread.currentThread().getName());}});// 关闭线程池threadPool.shutdown();}
}
ThreadPoolExecutor是Java中用于管理和执行线程任务的一个实现类。
new ThreadPoolExecutor的参数:
1. corePoolSize(核心线程数):
指定线程池中保持活动状态的线程数,即最小的线程数。即使线程处于空闲状态,核心线程也不会被回收。如果提交的任务数小于核心线程数,线程池会创建新的线程来处理任务。
2. maximumPoolSize(最大线程数):
指定线程池中允许存在的最大线程数。当提交的任务数超过核心线程数时,线程池会创建新的线程来处理任务,直到达到最大线程数。如果任务数继续增加,而线程池已经达到最大线程数,后续的任务将会被放入任务队列中等待执行。
3. keepAliveTime(线程空闲时间):
指定线程的空闲时间,即当线程池中的线程空闲时间超过该值时,多余的线程将被回收。只有当线程池中的线程数大于核心线程数时,才会应用空闲时间。
4. unit(空闲时间的单位):
指定线程空闲时间的单位,可以是TimeUnit.SECONDS、TimeUnit.MINUTES等。
5. workQueue(任务队列):
指定线程池的任务队列,用于存储等待执行的任务。可以使用不同的队列实现,如ArrayBlockingQueue、LinkedBlockingQueue等,这些队列都实现了BlockingQueue接口。
workQueue是一个容器,这个容器存储将要执行的任务 .
当线程池中的线程已经达到核心线程数,并且有新的任务提交时,这些任务会被放入任务队列中等待执行。
任务队列的大小会影响线程池的行为。如果任务队列的大小有限,当任务数超过队列大小时,线程池会根据最大线程数来创建新的线程来处理任务。如果任务队列的大小为无界(例如LinkedBlockingQueue),则线程池会一直接受新的任务,直到达到最大线程数。
通过调整这些参数,可以根据实际需求来配置线程池的行为。例如,通过增加核心线程数和最大线程数,可以提高线程池的并发能力;通过调整线程空闲时间和任务队列的大小,可以控制线程池的资源消耗和任务处理能力。 需要根据具体的应用场景和需求来选择合适的参数值,以达到最佳的性能和资源利用率。