目录
1. 固定数量的线程池
2. 带缓存的线程池
3. 执⾏定时任务
4. 定时任务单线程
5. 单线程线程池
6. 根据当前CPU⽣成线程池
7. ThreadPoolExecutor
(1). Executors ⾃动创建线程池可能存在的问题
(2). ThreadPoolExecutor 使⽤
线程状态
1. 固定数量的线程池
线程池的使用(7种创建方法)_Youcan.的博客-CSDN博客
2. 带缓存的线程池
线程池的使用(7种创建方法)_Youcan.的博客-CSDN博客
3. 执⾏定时任务
线程池的使用(7种创建方法)_Youcan.的博客-CSDN博客
4. 定时任务单线程
线程池的使用(7种创建方法)_Youcan.的博客-CSDN博客
5. 单线程线程池
线程池的使用(7种创建方法)_Youcan.的博客-CSDN博客
6. 根据当前CPU⽣成线程池
线程池的使用(7种创建方法)_Youcan.的博客-CSDN博客
7. ThreadPoolExecutor
(1). Executors ⾃动创建线程池可能存在的问题
a. OOM 代码演示
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolDemo54 {
static class MyOOMClass {
// 1M 空间(M KB Byte)
private byte[] bytes = new byte[1 * 1024 * 1024];
}
public static void main(String[] args) throws InterruptedException {
Thread.sleep(15 * 1000);
ExecutorService service = Executors.newCachedThreadPool();
Object[] objects = new Object[15];
for (int i = 0; i < 15; i++) {
final int finalI = i;
service.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(finalI * 200);
} catch (InterruptedException e) {
e.printStackTrace();
}
MyOOMClass myOOMClass = new MyOOMClass();
objects[finalI] = myOOMClass;
System.out.println("任务:" + finalI);
}
});
}
}
}
执行结果:
b. 关于参数设置
-XX:标准设置,所有 HotSpot 都⽀持的参数。-X:⾮标准设置,特定的 HotSpot 才⽀持的参数。-D:程序参数设置,-D参数=value,程序中使⽤:System.getProperty("获取")。
mx 是 memory max 的简称
(2). ThreadPoolExecutor 使⽤
a. ThreadPoolExecutor 参数说明
b. 线程池执⾏流程
c. 执⾏流程验证
<MS>
线程池的重要执行节点:
1. 当任务来了之后,判断线程池中实际线程数是否小于核心线程数,如果小于就直接创建并执行任务。
2. 当实际线程数大于核心线程数(正式员工),他就会判断任务队列是否已满,如果未满就将任务存放队列即可。
3. 判断线程池的实际线程数是否大于最大线程数(正式员工 + 临时员工),如果小于最大线程数,直接创建线程执行任务;实际线程数已经等于最大线程数,则会直接执行拒绝策略。
d. 拒绝策略
(4种 JDK 提供的拒绝策略 + 1 种 自定义拒绝策略)
Java ⾃带的拒绝策略,CallerRunsPolicy:
public class ThreadPoolDemo14 {
public static void main(String[] args) {
ThreadFactory factory = new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
return thread;
}
};
// 手动创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 100, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1), new ThreadPoolExecutor.CallerRunsPolicy());
for (int i = 0; i < 4; i++) {
int finalI = i;
executor.submit(() -> {
System.out.println(Thread.currentThread().getName() + "执行任务:" + finalI);
});
}
//终止线程
executor.shutdown();
}
}
输出
main执行任务:2
pool-1-thread-1执行任务:0
main执行任务:3
pool-1-thread-1执行任务:1
⾃定义拒绝策略:
线程状态
shutdown 执⾏时线程池终⽌接收新任务,并且会将任务队列中的任务处理完;shutdownNow 执⾏时线程池终⽌接收新任务,并且会给终⽌执⾏任务队列中的任务。
1. RUNNING:这个没什么好说的,这是最正常的状态:接受新的任务,处理等待队列中的任务;SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务;2. STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执⾏任务的线程;3. TIDYING:所有的任务都销毁了,workCount 为 0。线程池的状态在转换为 TIDYING 状态时,会执 ⾏钩⼦⽅法 terminated();
4. TERMINATED:terminated() ⽅法结束后,线程池的状态就会变成这个。