1.在阿里巴巴开发手册中指出不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,所以大部分我们都是使用ThreadPoolExecutor

线程池定义大小和qps_线程池定义在静态变量_自定义线程池

2.使用ThreadPoolExecutor 那么就得知道七大参数

自定义线程池_线程池定义在静态变量_线程池定义大小和qps

3.四种拒绝策略

自定义线程池_线程池定义大小和qps_线程池定义在静态变量

4.正常银行办理业务场景

线程池定义大小和qps_自定义线程池_线程池定义在静态变量

解析:这里只开了两个窗口办理业务,当客户来办理时只能在这两个窗口办理业务,人越来越多,就会在候客区等待,依次办理业务

5.假设有一天要办理的客户超级多

线程池定义在静态变量_自定义线程池_线程池定义大小和qps

解析:当客户很多是,那么银行就会开启其他几个窗口,当窗口人数已满,候客区也满了,这时候还有客户来办理业务,那么银行就会采取拒绝措施(这里只是虚拟,正常银行不会这么干,只是客户自己会选择离开)

6.Java自定义线程池来模拟银行办理业务场景

package com.kuang.threadpool;import java.util.concurrent.Executors;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class ThreadPoolExecutorDemo {    public static void main(String[] args) {        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(                2,//开启的窗口                5,//最多的窗口                2,//超时的时间                TimeUnit.SECONDS,//超时的单位                new LinkedBlockingQueue(3),//候客区                Executors.defaultThreadFactory(),//创建线程的工厂                new ThreadPoolExecutor.DiscardOldestPolicy()//银行的拒绝策略        );

try { //最大承载:Deque + max //超过 RejectedExecutionException for (int i = 1; i <= 9; i++) { threadPool.execute(()->{ System.out.println(Thread.currentThread().getName()+" ok"); }); } } catch (Exception e) { e.printStackTrace(); } finally { threadPool.shutdown(); } }}

测试结果:当1~5人办理业务时只会在第一和第二个窗口进行办理

线程池定义大小和qps_线程池定义在静态变量_自定义线程池

测试结果:当6~8人办理业务是,就会开启5个窗口办理业务

测试结果:当超过8人时,银行就会采取拒绝策略(这里采用抛出异常)

自定义线程池_线程池定义在静态变量_线程池定义大小和qps

7.七大参数提取

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(     2,//开启的2个窗口     5,//最多的窗口     2,//超时的时间,就是超过一定时间,其他3个窗口就会关闭    TimeUnit.SECONDS,//超时的单位    new LinkedBlockingQueue(3),//候客区    Executors.defaultThreadFactory(),//创建线程的工厂    new ThreadPoolExecutor.DiscardOldestPolicy()//银行的拒绝策略  );

限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注