首页 > 其他分享 >JUC2 ThreadPool

JUC2 ThreadPool

时间:2022-12-07 17:04:49浏览次数:43  
标签:ThreadPool Executors 队列 JUC2 任务 线程 new ThreadPoolExecutor


1. 线程池架构

JDK提供两种线程池类型,一种是ThreadPoolExcutor,一种是ForkJoinPool. 本节课重点讲解ThreadPoolExcutor。

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果显示超过了最大数量,超出的数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行

java中的线程池是通过 Excutor 框架实现的,该框架用到了 Excutor,Excutors,ExcutorService, ThreadPoolExcutor 这几个类。

主要特点为:线程复用 | 控制最大并发数 | 管理线程.

 

JUC2 ThreadPool_线程池

2.ThreadPoolExecutor

2.1 线程池分类(四类线程池的底层都是ThreadPoolExecutor)

JUC2 ThreadPool_jvm_02

JUC2 ThreadPool_开发语言_03

(1).Executors.newFixedThreadPool(int) : 一池N线程

JUC2 ThreadPool_java_04

(2).Executors.newSingleThreadExecutor( ) : 一池一线程 

JUC2 ThreadPool_开发语言_05

 (3).Executors.newCachedThreadPool( ) : 一池可扩容线程

JUC2 ThreadPool_抛出异常_06

(4).Executors.newScheduledThreadPool( ) : 创建一个定长线程池, 支持定时及周期性任务执行。

2.2 七个参数

①. corePoolSize:线程池中的常驻核心线程数
在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,近似理解为今日当值线程;当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入到缓存队列当中.
②. maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1

③. keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止(非核心线程)

④. unit:keepAliveTime的单位

⑤. workQueue:任务队列,被提交但尚未被执行的任务(候客区)

⑥. threadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可(银行网站的logo | 工作人员的制服 | 胸卡等)

⑦. handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝
 

JUC2 ThreadPool_线程池_07

2.3 工作流程

2.3.1 流程图:一句话就是优先核心线程,阻塞队列次之,最后非核心线程,最终拒绝策略

JUC2 ThreadPool_java_08

2.3.2 解释

JUC2 ThreadPool_线程池_09

3. 考点:线程池用过吗?生产上你是如何设置合理参数

3.1 线程池的拒绝策略

①. 等待队列也已经排满了,再也塞不下新的任务了。同时,线程池的maximumPoolSize也到达了,无法接续为新任务服务,这时我们需要拒绝策略机制合理的处理这个问题

②. JDK内置的拒绝策略

JUC2 ThreadPool_线程池_10

3.2 你在工作中单一的/固定数的/可变你的三种创建线程池的方法,你用哪个多?超级大坑?

①. 答案是一个都不用,我们生产上只能使用自定义的

②. Executors中JDK给你提供了为什么不用?

参考阿里巴巴java开发手册

JUC2 ThreadPool_java_11

3.3 你在工作中是如何创建线程池的,是否自定义过线程池使用

public class MyThreadPoolDemo {
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
//默认抛出异常
//new ThreadPoolExecutor.AbortPolicy()
//回退调用者
//new ThreadPoolExecutor.CallerRunsPolicy()
//处理不来的不处理,丢弃时间最长的
//new ThreadPoolExecutor.DiscardOldestPolicy()
//直接丢弃任务,不予任何处理也不抛出异常
new ThreadPoolExecutor.DiscardPolicy()
);
//模拟10个用户来办理业务 没有用户就是来自外部的请求线程.
try {
for (int i = 1; i <= 10; i++) {
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + "\t 办理业务");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
//threadPoolInit();
}
}

3.4 合理配置线程池你是如何考虑的?

①. CPU密集型

JUC2 ThreadPool_java_12

②. IO密集型

JUC2 ThreadPool_抛出异常_13

标签:ThreadPool,Executors,队列,JUC2,任务,线程,new,ThreadPoolExecutor
From: https://blog.51cto.com/u_15905340/5919715

相关文章

  • java15源码-ThreadPoolExecutor
    一Executors工具类创建ThreadPoolExecutorSingleThreadExecutornewFixedThreadPoolnewCachedThreadPoolnewScheduledThreadPoolnewSingleThreadScheduledExecuto......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    (目录)一、说明RejectedExecutionHandler当线程池已经被关闭,或者任务数超过maximumPoolSize+workQueue时执行拒绝策略ThreadPoolExecutor.AbortPolicy默认拒绝策略,丢......
  • python 线程池 ThreadPoolExecutor
    从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor(线程池)和ProcessPoolExecutor(进程池)两个类。相比threading等模块,该模......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.AbortPolicy​​​​2.DiscardPolicy​​​​3.DiscardOldestPolicy​​​​4.CallerRunsPolicy​​​​5.自......
  • 性能爆表:利用ThreadPoolTaskExecutor批量插入百万级数据实测!
    来源:azdebug.blog.csdn.net/article/details/103697108前言开发目的:提高百万级数据插入效率。采取方案:利用ThreadPoolTaskExecutor多线程批量插入。采用技术:spring......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • Java 线程池之ThreadPoolExecutor学习总结
    前提javaversion"1.8.0_25"池简述软件开发活动中,我们经常会听到数据库连接池、内存池、线程池等各种“池”概念,这些“池”到底是什么东西呢?程序的世界里,我们可以将池简单......
  • ThreadPoolExecutor 源码解析
    Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。合理地使用线程池能够带来3个好处:降低资源消耗。通过重复利用已创建的线......
  • <1> 线程池---ThreadPoolExecutor
    1importtime2fromconcurrent.futuresimportThreadPoolExecutor,as_completed,ProcessPoolExecutor345classSpider:67executor=Thre......
  • Java多线程-ThreadPool线程池(三)
    开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要......