一、线程池的基本概念
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!
关于线程池部分的简单分析就到了!