目录
相信大家对线程池也有一定的了解,在这里我就不过多的赘述了
线程池中有:三大方法、七大参数、四种拒绝策略
一:线程池的好处
- 降低了资源的消耗
- 方便管理
- 提高了我们的相应速度
二:线程池三大方法
我们线程池中有三大方法,在这里我给大家来讲解一
ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程,这个线程池只有一个线程 ExecutorService threadPool = Executors.newFixedThreadPool(5);//创建一个固定的线程池的大小 ExecutorService threadPool =Executors.newCachedThreadPool();//缓存,就是可伸缩的,遇强贼强,遇弱则弱
但是这三种方法创建线程池都是有弊端的,最主要的就是OOM,通过阅读阿里巴巴开发手册我们可以知道
所以我们要通过TreadPoolExecutor的方式来创建线程池。
来看一段TreadPoolExecutor的方式来创建线程池的源码:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
三:七大参数
通过上文的源码中我们可知,使用TreadPoolExecutor来创建线程池的时候,需要有七个参数
- int corePoolSize 核心线程数
- int maximumPoolSize 最大线程数
- long keepAliveTime空闲线程最大存活时间
- TimeUnit unit 时间单位
- BlockingQueue<Runnable> workQueue 任务队列
- ThreadFactory threadFactory 创建线程工厂
- 任务的拒绝策略(四个)
下面我们通过代码使用TreadPoolExecutor来创建线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
2,//核心线程
5,//最大线程数
3,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),//线程工厂
// new ThreadPoolExecutor.AbortPolicy()//拒绝策略//满了还有人进来,不处理这个人的,抛出异常,这个是中止策略,超出最大值(最大线程数+等待队列),就会RejectedExecutionException
// new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去哪里,
// new ThreadPoolExecutor.DiscardPolicy()//队列满了,不会抛出异常,队列满了,丢掉任务
new ThreadPoolExecutor.DiscardOldestPolicy()//替换旧的,队列满了,尝试和占用时间最久的竞争,也不会抛出异常
);
四:四大策略
- new ThreadPoolExecutor.AbortPolicy() 丢弃任务并抛出RejectedExecutionException异常,是默认的策略。
- new ThreadPoolExecutor.DiscardPolicy() 丢弃任务,但是不会抛出异常,这是不推荐的做法
- new ThreadPoolExecutor.DiscardOldestPolicy() 抛弃队列中等待最久的任务,然后把当前任务加入到队列中
- new ThreadPoolExecutor.CallerRunsPolicy() 调用任务的run()方法绕过线程池去执行
总结:
1.cpu密集型 我的电脑是8核处理器,几核cpu就定义为几,这样可以保证cpu效率最高System.out.println(Runtime.getRuntime().availableProcessors());//获取本机中cpu的核数 2.IO 密集型 密集型->判断你程序中十分消耗IO的线程 程序 15个大型任务 io十分占用资源,用他的两倍来定义最大线程
以上就是我对创建线程池的理解,不对的地方还请多多指正,谢谢大家的阅读。