Java面试题(二十) 手写线程池+解析四大隔离策略

一. 实现线程池步骤

七大核心参数全部都使用上:
  	 1. 2个核心线程 (2个工作员工)
     2. 池中可以有5个线程 (最多有5个员工)
     3. 1秒后判断是否过了高峰期,需不需要撤掉其他员工
     4. 时间的单位
     5. 任务队列 (候客区设置为3位)
     6. 线程工厂 (默认银行Logo)
     7. 隔离策略 (超过我设置的最大员工数加候客区人数,就会拒绝其他客户在这个银行办公)

不熟悉线程池七大核心参数请看这篇:细说线程池七大核心参数

二. 四大隔离策略与手写线程池

1. 使用默认隔离策略

//线程池
public static void main(String[] args) {

        ExecutorService threadPool = 
        new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()); 
                //默认策略,可以报异常
                //9个客户超过了设置的客户上限就会报错: RejectedExecutionException
             
        //模拟出10个客户,来办理业务,一个用户代表一个请求线程
        try {
            //10个客户
            for (int i = 1; i <= 10; i++) {
                //启动
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭
            threadPool.shutdown();
        }
    }

运行结果:
在这里插入图片描述
2. 使用回调策略

//线程池
public static void main(String[] args) {

        ExecutorService threadPool = 
        new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(3),
                Executors.defaultThreadFactory(),
               	new ThreadPoolExecutor.CallerRunsPolicy()); 
               	//回调策略
                //不会报错,如果线程不够用,会推回到调用者那里去,例如推回到main线程
             
        //模拟出10个客户,来办理业务,一个用户代表一个请求线程
        try {
            //10个客户
            for (int i = 1; i <= 10; i++) {
                //启动
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭
            threadPool.shutdown();
        }
    }

运行结果:
在这里插入图片描述
3. 使用丢弃最久策略

//线程池
public static void main(String[] args) {

        ExecutorService threadPool = 
        new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(3),
                Executors.defaultThreadFactory(), 
               	new ThreadPoolExecutor.DiscardOldestPolicy()); 
               	//丢弃最久策略
                //不会报错,但是会丢掉线程,输出的就是最大线程数加候客区人数
             
        //模拟出10个客户,来办理业务,一个用户代表一个请求线程
        try {
            //10个客户
            for (int i = 1; i <= 10; i++) {
                //启动
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭
            threadPool.shutdown();
        }
    }

运行结果:
在这里插入图片描述
4. 使用丢弃策略

//线程池
public static void main(String[] args) {

        ExecutorService threadPool = 
        new ThreadPoolExecutor(2,5,1L,TimeUnit.SECONDS,
                new LinkedBlockingDeque<Runnable>(3),
                Executors.defaultThreadFactory(), 
               	new ThreadPoolExecutor.DiscardPolicy()); 
               	//丢弃策略
                //不会报错,但是会丢掉线程,输出的就是最大线程数加候客区人数
                //如果允许丢失任务,这个策略是最好的
             
        //模拟出10个客户,来办理业务,一个用户代表一个请求线程
        try {
            //10个客户
            for (int i = 1; i <= 10; i++) {
                //启动
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务。。。");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭
            threadPool.shutdown();
        }
    }

运行结果:
在这里插入图片描述

总结:手写线程池主要在于七大参数,最后的隔离策略可以按照生产环境自行调配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值