多线程(线程池)
线程池:
主要核心原理:
1.创建一个池子,池子中是空的;
2.提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子;
下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可;
3.但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待;
创建线程池的方法:
public static ExecutorService newCachedThreadPool() 创建一个没有上限的线程池(int的最大值)
public static ExecutorService newFixedThreadPool(int nThreads) 创建有上限的线程池
自定义线程池:
创建自定义线程池:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor() 自定义线程池,有七个参数
七大参数:
参数一:正式员工数量 -> 核心线程数量(不能小于0)
参数二:餐厅最大员工数 -> 线程池中最大线程的数量(最大数量>=核心线程数量)
参数三:临时员工空闲多长时间被辞退(值) -> 空闲时间(值)(不能小于0)
参数四:临时员工空闲多长时间被辞退(单位) -> 空闲时间(单位)(用TimeUnit指定)
参数五:排队的客户 -> 阻塞队列(不能为null)
参数六:从哪里招人 -> 创建线程的方式(不能为null)
参数七:当排队人数过多,超出顾客请下次再来(拒绝服务)-> 要执行的任务过多时的解决方案(不能为null)
任务拒绝策略:
ThreadPoolExecutor.AbortPolicy 默认策略:丢弃任务并抛出RejectedExecutionException异常(内部类)
工作原理:
- 创建一个空的池子;
- 有任务提交时,线程池会创建线程去执行任务,执行完毕归还线程;
- 不断地提交任务,会有以下三个临界点:
- 当核心线程满时,再提交任务就会排队;
- 当核心线程满,队伍满时,会创建临时线程;
- 当核心线程满,队伍满,临时线程满时,会触发任务拒绝策略;
线程池的大小: