JUC线程池和Tomcat线程池

这篇主要讲一下JUC线程池和Tomcat线程池的使用。

简单的讲,
JUC 线程池的工作过程是,优先使用核心线程数,然后填充队列,如果队列填满了,再启用最大线程数。
Tomcat 线程池则是,优先使用核心线程数,然后再使用最大线程数,如果满了,再填充队列。
所以 JUC 线程池适合计算密集型的任务, Tomcat线程池则适合IO密集型的任务。

JUC 线程池

1
2
3
4
5
6
7
8
threadPoolExecutor = new ThreadPoolExecutor(
4,
32,
1L,
TimeUnit.MINUTES,
taskQueue,
tf, new ThreadPoolExecutor.CallerRunsPolicy());

Tomcat 线程池

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tomcat创建线程池
public void createExecutor() {
internalExecutor = true;
// 任务队列和普通的队列有所区别,后续分析
TaskQueue taskqueue = new TaskQueue();
// 线程工厂用于创建线程 本地项目name=http-nio-port-exec-序号
TaskThreadFactory tf = new TaskThreadFactory(getName() + "-exec-", daemon, getThreadPriority());
// 创建线程池,注意这个ThreadPoolExecutor和java.util.concurrent包下的ThreadPoolExecutor有所区别
executor = new ThreadPoolExecutor(getMinSpareThreads(), getMaxThreads(), 60, TimeUnit.SECONDS,taskqueue, tf);
// 给任务队列设置线程池,用于后续任务来了判断是创建线程执行还是将线程添加到任务队列
taskqueue.setParent( (ThreadPoolExecutor) executor);
}


threadPoolExecutor = new ThreadPoolExecutor(
0,
32,
1L,
TimeUnit.MINUTES,
taskQueue,
tf, new ThreadPoolExecutor.CallerRunsPolicy());

参考文章


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!