前言
线程池就是用于管理线程对象的池子
优点: 1.解决频繁创建线程和销毁线程消耗的性能问题
2.解决大量创建线程导致的内存泄漏问题
创建线程池的两种方式
一、通过工具类完成线程池的创建--[Executors],语法简单,但是阿里巴巴不建议使用
二、通过线程池类--[ThreadPoolExecutor],,语法复杂但是更加灵活,阿里巴巴建议使用
execute和submit的区别
两个方法都是用来执行线程任务,但是execute属于Executor中的方法,二submit属于ExecutorService接口中的方法
submit可以执行runnable和callable类型的任务,而execute只能执行Runnable类型的任务,submit执行完任务后有返回结果
一、Executors
1、固定大小的线程池对象newFixedThreadPool
2、单一线程池newSingleThreadExecutor
3、可变线程池newCachedThreadPool
4、延迟||任务线程池newScheduledThreadPool
main{
//1、创建固定为5个的线程池,返回类型为ExecutorService
ExecutorService e=Executors.newFixedThreadPool(5);
//2、创建单一线程池[池子只有一个线程对象]适合任务顺序执行
ExecutorService e=Executors.newSingleThreadExecutor();
//3、创建可变线程池[池子线程的数量随着任务多少而变化]
ExecutorService e=Executors.newCachedThreadPool();
//4、延迟线程池[指定时间后执行]
ScheduledExecutorService e=Executors.newScheduledThreadPool(5);
//执行线程任务 Runnable Callable Integer.MAX()
for(int i =0;i<10,i++){
//首先要传递Runnable对象 || [1]创建Runnable接口 || [2]匿名内部类对象 || [3]lambda表达式
executorService.execute(new Runnable){
public void run(){
sout("任务代码块")
}
}
//10秒后执行任务代码块
executorService.schedule(()->{
sout("十秒后执行的任务代码块");
},10,TimeUnit.SECONDS);
//第一个五秒执行一次后面2秒执行一次
executorService.scheduleAtFixedRate(()->{
sout("初始化五秒执行一次,之后两秒再执行");;
},5,2,TimeUnit.SECONSD);
}
}
二、ThreadPoolExecutor
main{
BlockingQueue<Runnable> b = new ArrayBlockingQueue(5);
ThreadPoolExecutor p = new ThreadPoolExecutor(2,5,10,TimeUnit.SECONDS,b);
for(int i =0;i<10;i++){
poolEecutor.submit(()->{
sout("2为银行正式工,如果线程数大于正式工的数量,临时工就会工作,5为正式工加上临时工的总员工数。如果临时工10秒还没事干,就会销毁,但是正式工还会继续存在保持线程数量。b是等待队列的数量,可以加入第六个参数【策略】")
})
}
}