线程池是Java等编程语言中常用的一种多线程处理形式,它可以管理和控制线程的数量,减少了系统开销,提高了处理效率。以下是一些线程池的常用参数:
corePoolSize
corePoolSize是线程池中保持活动的最小线程数。这个参数决定了线程池在启动后初始创建的线程数量。当提交一个任务时,如果线程池中的线程数量小于corePoolSize,就会立即创建新的线程执行任务。如果线程池中的线程数量已经达到corePoolSize,则任务会被放入任务队列中等待。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>() // 任务队列
);
maximumPoolSize
maximumPoolSize表示线程池中允许同时执行的最大线程数。如果任务的数量超过了线程池中的核心线程数,并且队列已满,线程池会创建更多的线程来处理任务,但是最多不超过maximumPoolSize。如果已经达到了maximumPoolSize,并且队列已满,那么任务会直接被拒绝。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>() // 任务队列
);
keepAliveTime
keepAliveTime表示超过corePoolSize数量的空闲线程在多少时间内会被销毁。也就是说,当线程池中的线程数量超过了corePoolSize,但是在这段时间内没有新的任务提交,那么超出corePoolSize部分的线程会被销毁,直到线程池中的线程数量等于corePoolSize为止。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>() // 任务队列
);
unit
unit表示keepAliveTime的时间单位。在上面的代码例子中,keepAliveTime的单位是秒。可以根据需要设置为其他的时间单位,比如毫秒、分钟等。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keep结点数量超过Core时的时间(以秒计)1503939327125指定的网络配置从/sys/class/net/<接口>/carrier中加载1503939327125指定的网络配置从/sys/class/net/<接口>/carrier中加载0, // keepAliveTime
TimeUnit.SECONDS, // unit为秒
new LinkedBlockingQueue<Runnable>() // 任务队列
);
workQueue
workQueue是任务队列,用于存放待执行的任务。当线程池中的线程数量小于corePoolSize时,新提交的任务会被放入此队列中等待。如果队列已满,任务会被拒绝。Java中提供了多种类型的任务队列,例如LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue等。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(1024) // 任务队列
);
threadFactory
threadFactory是一个接口,用于创建线程池中的工作线程。默认情况下,线程工厂会创建一个与提交任务线程相同身份的线程。但是,如果需要为线程池中的线程设置一些属性,比如线程名、优先级等,可以自定义threadFactory。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(1024), // 任务队列
new ThreadFactory() {
private int count = 0;
@Override
public Thread newThread(Runnable r) {
count++;
Thread thread = new Thread(r);
thread.setName("MyThread-" + count);
thread.setPriority(Thread.MAX_PRIORITY);
return thread;
}
} // 线程工厂
);
handler
handler是任务拒绝策略,表示当队列满了并且工作线程大于等于maximumPoolSize时如何来拒绝请求执行的runnable的策略。常见的策略有AbortPolicy(默认策略,直接抛出运行时异常)、CallerRunsPolicy(调用者线程运行任务)、DiscardOldestPolicy(丢弃队列中最老的任务)、DiscardPolicy(直接丢弃任务)。可以通过继承RejectedExecutionHandler接口自定义拒绝策略。
ExecutorService executor = new ThreadPoolExecutor(
5, // corePoolSize
10, // maximumPoolSize
60, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(1024), // 任务队列
new ThreadFactory(), // 线程工厂
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("Task " + r.toString() + " is rejected.");
}
} // 拒绝策略
);