线程池问题探究

发现问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    Semaphore semaphore = new Semaphore(nThread);//定义几个许可
//这里
ExecutorService executorService =new ThreadPoolExecutor(1, nThread,
1000L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<>(1));//创建一个固定的线程池
for (T obj : list) {
try {
semaphore.acquire();
executorService.execute(() -> {
try {
func.accept(obj);
} catch (Exception ex) {
Logger.error("startWithMultiThread 出错!"+ex.getMessage());
} finally {
semaphore.release();
}
});
} catch (InterruptedException e) {
Logger.error("startWithMultiThread 出错!"+e.getMessage());
}
}


public static void main(String[] args) {
ArrayList<Object> objects = Lists.newArrayList();
for (int i = 0; i < 1000; i++) {
objects.add(i);
}
startWithMultiThread(objects,5, obj -> {
Threads.sleep(1000);
System.out.println(obj);
});
}
阅读更多

线程池源码解读

线程池的在 Java并发中使用最多的一种手段,也是性能和易用性相对来说比较均衡的方式,下面我们就一起探索先线程池的原理。

线程池分配线程流程

对于线程池的使用,在这篇文章中就不过多的赘述,首先我们先看下线程池的分配线程的逻辑。

我们知道,在创建线程池的有 7 个核心的参数:

corePoolSize:核心线程数

maximumPoolSize:最大线程数

keepAliveTime:空闲线程存活时间

TimeUnit: 单位

workQueue:阻塞队列

ThreadFactory: 线程工厂

RejectedExecutionHandler: 拒绝策略

在这 7 个参数中,其中我们最重要的几个参数是 corePoolSize,maximumPoolSize,workQueue ,这三个参数来决定线程池主要的线程数和任务队列长度。

具体的流程图如下(图片来自网上,侵删):

image-20220813132419857

阅读更多