java并发编程-线程池 绝地灬酷狼 2022-04-24 07:26 277阅读 0赞 ## 为什么要用线程池 ## 1. 降低资源消耗 2. 提高响应速度 T1: 线程创建的时间 T2:工作任务运行额时间 T3: 线程销毁时间 3. 提高了线程的可管理性 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70] ## ThreadPoolExecutor ## corePoolSize: 核心线程数;如果执行的线程数大于核心线程数, 则会先进入到阻塞队列里 maxinumPoolSize:允许最大线程数; 线程池所创建的线程数一定小于这个值 keepAliveTime:空闲线程所存活的时间 TimeUnit:keepAliveTime 的时间单位 workQueue: 阻塞队列 threadFactory:线程工厂,给每个新建的线程命名, 缺省的线程命名规则:pool数字+thread 数字 RejectedExectionHandler:饱和策略。 阻塞队满了, 没有空闲线程时的处理方法 1.AbortPolicy:直接抛出异常 默认 2.CallerRunsPolicy: 调用者所在的线程来执行任务 3.DiscardOldestPolicy:丢弃最老的任务 4.DiscardPolicy:直接丢弃的任务 都不满足时, 可以使用RejectExecutionHandler接口自定义保护和策略 线程池的使用: 核心线程数是2 , 满了之后, 又启动了2 个线程(因为最大线程数是4), 虽然最终是6 个任务, 但是只启动了4 个线程来执行 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 1] ![在这里插入图片描述][20190420184334484.png] ![在这里插入图片描述][2019042019073830.png] ## FixedThreadPool : 使用固定线程数的线程池。 ## ## SignleThreadExecutor: 单个线程 ## 有6 个任务只创建一个线程来执行 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 2] ## CachedThreadPool: 缓冲线程池 。 无上限的创建线程 最佳场景, 每个任务都非常短, 度熬到创建一个新县城所需要的时间 ## 有6 个任务, 就创建了6 个线程 ![在这里插入图片描述][20190420184605230.png] ![在这里插入图片描述][20190420184622748.png] ## WorkStealingPool()(jdk1.7 以后):工作密取 ## ## ScheduledThreadPoolExecutor()定期执行任务的线程 ## delay: 提交任务过多久之后才执行 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 3] scheduleAtFixedRate:固定时间间隔 循环执行 时间间隔60s 任务A 执行需要80s, 任务B 执行需要20 s, 任务C 执行需要50s 则A 执行的时间是, 0 -80s B 执行的时间是: 81-100s(到100s 的时候已经执行完了, 但是时间间隔还有60-20=40s) C 的执行时间是 140-190(还有60-50 的间隔时间) 任务D 再执行则是 200 开始 scheduleWithFixedDelay:固定延时间隔的循环执行 时间间隔是 60s 任务A 执行需要80s, 任务B 执行需要20 s, 任务C 执行需要50s 则A 执行的时间是, 0 -80s B执行的时间是:(80+60)=140——160 C执行的时间是:(160+60)=220——270 任务D 再执行则是 270+60=230 开始 如果报异常, 我们处理了异常, 下个任务会继续执行, 如果没有则中断定时任务的机制 ## 线程执行顺序: ## 当有任务需要执行时, 线程池先创建线程,放到核心线程里。 如果创建的线程数达到核心线程数 , 则将任务推荐阻塞队列, 如果阻塞队列也满了, 线程池继续创建线程来还行任务, 知道线程数达到最大线程。 如果最大线程数满了, 队列也满了, 进入饱和策略 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 4] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70]: /images/20220217/7a555407678e4d249595d664bf63c6cf.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 1]: /images/20220217/cf9e96833e294eb6a4bab59f8f2c6c84.png [20190420184334484.png]: /images/20220217/6ef38a10be0946dba96865781dafa350.png [2019042019073830.png]: /images/20220217/d38a1159edf4441f9c16822d536e4277.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 2]: /images/20220217/3958fc331c3a40b59cbc698bdd7a9792.png [20190420184605230.png]: /images/20220217/f91f8dff3f624bcfafc09a7982f7a196.png [20190420184622748.png]: /images/20220217/37985a28f96d4543853f94c0aad056e1.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 3]: /images/20220217/c053784812624f048ecf8ec32f498208.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 4]: /images/20220217/a68f200cb63a42ab8b3e9e8278df1227.png
还没有评论,来说两句吧...