线程池的使用(7种创建方法)

2年前 (2022) 程序员胖胖胖虎阿
195 0 0

目录

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 ⾃动创建线程池可能存在的问题

线程池的使用(7种创建方法)

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);
               }
           });
       }
   }
}

线程池的使用(7种创建方法)

线程池的使用(7种创建方法) 执行结果:

线程池的使用(7种创建方法)

b. 关于参数设置

-XX:标准设置,所有 HotSpot 都⽀持的参数。
-X:⾮标准设置,特定的 HotSpot 才⽀持的参数。
-D:程序参数设置,-D参数=value,程序中使⽤:System.getProperty("获取")。

mx 是 memory max 的简称 

(2).  ThreadPoolExecutor 使⽤

a. ThreadPoolExecutor 参数说明

线程池的使用(7种创建方法)

b. 线程池执⾏流程

线程池的使用(7种创建方法)

 

c. 执⾏流程验证

 <MS>

线程池的重要执行节点:

1. 当任务来了之后,判断线程池中实际线程数是否小于核心线程数,如果小于就直接创建并执行任务。

2. 当实际线程数大于核心线程数(正式员工),他就会判断任务队列是否已满,如果未满就将任务存放队列即可。

3. 判断线程池的实际线程数是否大于最大线程数(正式员工 + 临时员工),如果小于最大线程数,直接创建线程执行任务;实际线程数已经等于最大线程数,则会直接执行拒绝策略。

d. 拒绝策略

(4种 JDK 提供的拒绝策略 + 1 种 自定义拒绝策略)

线程池的使用(7种创建方法)

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

⾃定义拒绝策略:

 线程池的使用(7种创建方法)

 

线程状态

线程池的使用(7种创建方法)

shutdown 执⾏时线程池终⽌接收新任务,并且会将任务队列中的任务处理完;
shutdownNow 执⾏时线程池终⽌接收新任务,并且会给终⽌执⾏任务队列中的任务。
1. RUNNING:这个没什么好说的,这是最正常的状态:接受新的任务,处理等待队列中的任务;
SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务;
2. STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执⾏任务的线程;

3. TIDYING:所有的任务都销毁了,workCount 为 0。线程池的状态在转换为 TIDYING 状态时,会执 ⾏钩⼦⽅法 terminated();

4. TERMINATED:terminated() ⽅法结束后,线程池的状态就会变成这个。

版权声明:程序员胖胖胖虎阿 发表于 2022年10月12日 下午5:08。
转载请注明:线程池的使用(7种创建方法) | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...