java线程池核心参数使用示例
在线程池中,核心线程数、最大线程数和队列是三个重要的参数,它们之间的关系如下:
核心线程数(Core Pool Size):它表示线程池中保持活动状态的最小线程数。在没有任务执行时,核心线程会一直存活在线程池中。
最大线程数(Maximum Pool Size):它表示线程池中允许存在的最大线程数。当任务数量超过核心线程数并且队列已满时,线程池可以创建新的线程来处理任务,但是不会超过最大线程数。
队列:线程池任务队列用于存储等待执行的任务。当任务提交给线程池时,如果核心线程数还未达到上限,任务就会立即交由核心线程执行。如果核心线程数已满,并且队列未满,则任务会被添加到队列中等待执行。当任务数量超过队列容量时,线程池会根据最大线程数来判断是否创建新的线程。
综上所述,线程池中的任务处理流程如下:
如果核心线程数未达到上限,任务交由核心线程执行。
如果核心线程数已满,但队列未满,任务加入队列等待执行。
如果队列已满,并且当前线程数未达到最大线程数,创建新的线程执行任务。
如果队列已满,并且当前线程数已达到最大线程数,根据线程池的拒绝策略来处理任务(例如丢弃任务或抛出异常)。
public static void main(String[] args){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(30);
executor.setKeepAliveSeconds(60);
executor.setQueueCapacity(10);
executor.setThreadNamePrefix("my-custom");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
for(int i=1;i<50;i++){
Integer threadIndex = i;
Runnable run = new Runnable() {
@Override
public void run() {
System.out.println(DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss")+" "+threadIndex);
try {
Thread.sleep(1000*60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
executor.execute(run);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果
2024-01-04 10:12:07 2
2024-01-04 10:12:07 1
2024-01-04 10:12:07 3
2024-01-04 10:12:07 4
2024-01-04 10:12:07 5
2024-01-04 10:12:07 16
2024-01-04 10:12:07 17
2024-01-04 10:12:07 18
2024-01-04 10:12:07 19
2024-01-04 10:12:07 20
2024-01-04 10:12:07 21
2024-01-04 10:12:07 22
2024-01-04 10:12:07 23
2024-01-04 10:12:07 24
2024-01-04 10:12:07 25
2024-01-04 10:12:07 26
2024-01-04 10:12:07 27
2024-01-04 10:12:07 28
2024-01-04 10:12:07 29
2024-01-04 10:12:07 30
2024-01-04 10:12:07 31
2024-01-04 10:12:07 32
2024-01-04 10:12:07 33
2024-01-04 10:12:07 34
2024-01-04 10:12:07 35
2024-01-04 10:12:07 36
2024-01-04 10:12:07 37
2024-01-04 10:12:07 38
2024-01-04 10:12:07 39
2024-01-04 10:12:07 40
2024-01-04 10:12:07 41
2024-01-04 10:13:07 6
2024-01-04 10:13:07 7
2024-01-04 10:13:07 8
2024-01-04 10:13:07 9
2024-01-04 10:13:07 10
2024-01-04 10:13:07 11
2024-01-04 10:13:07 12
2024-01-04 10:13:07 13
2024-01-04 10:13:07 14
2024-01-04 10:13:07 15
2024-01-04 10:13:07 42
2024-01-04 10:13:07 43
2024-01-04 10:13:07 44
2024-01-04 10:13:07 45
2024-01-04 10:13:07 46
2024-01-04 10:13:07 47
2024-01-04 10:13:07 48
2024-01-04 10:13:07 49
以上示例中,最大线程30,核心线程5,任务队列10,线程按序号递增放入线程池,且并行线程数量远远超过了最大线程数量
可以看到,核心线程1-5首先执行
而6-15这10个线程在任务队列中,所以一直没机会执行
16-49这些线程一直在执行,但是同时执行的线程不会超过最大线程数30(有可能会稍微超过一两个)
等16-49执行了,任务队列里的6-15才有机会执行