多线程基础三:线程池

一、线程池的基本概念

1、基本概念

背景: 由于线程的创建和销毁在并发量比较大的情况下,非常消耗资源,对性能的影响比较大。
方案: 提前创建好多个线程,放入线程池中,需要的时候就取出,不需要的时候就放回,以此来避免线程的重复创建和销毁,实现线程的重复利用。

线程池的执行流程:
在这里插入图片描述

2、常见的四种线程池
//线程数量不固定,只要有空闲线程空闲时间超过设定值就会被回收,适用于并发不固定的短期任务
ExecutorService service1 = newCachedThreadPool();
//当前线程数能够稳定保持,适用于CPU任务密集且周期长任务
ExecutorService service2 = newFixedThreadPool(10);
//适用于一些定时任务
ExecutorService service3 = newScheduledThreadPool(10);
//适用于串行化,一个任务接一个任务
ExecutorService service4 = newSingleThreadExecutor();
/**
 * 但是在阿里开发手册中,不建议适用上述四种方法进行线程的直接创建。
 * 理由是上述四种方法的内部或者内部方法都包含有一个参数值Integer.MAX_VALUE
 * 该值为允许创建的最大线程数量,容易导致OOM(OutOfMemory)内存溢出
 *
 * 推荐的是使用ThreadPoolExecutor进行线程池创建
 * */

//核心线程数量,及时处于空闲状态也会被保留,除非设置了空闲超时时间
int corePoolSize = 2;
//线程池中允许存在的最大线程数量
int maximumPoolSize = 10;
//当线程数大于核心线程数时,允许空闲线程存活的时间
long keepAliveTime = 3000;
//设置时间单位
TimeUnit time = TimeUnit.SECONDS;
//用于存储线程任务的队列
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(3);

ThreadPoolExecutor Threadpool = new ThreadPoolExecutor(
        corePoolSize,maximumPoolSize,keepAliveTime,
        TimeUnit.SECONDS,queue);
poolExecutor.execute(() -> System.out.println("我是自己创建的线程池1!"));
poolExecutor.execute(() -> System.out.println("我是自己创建的线程池2!"));
//输出结果
我是自己创建的线程池1!
我是自己创建的线程池2

关于线程池部分的简单分析就到了!

猜你喜欢

转载自blog.csdn.net/weixin_39085109/article/details/106743885