自定义线程池

7个线程池参数:

  • corePoolsize:线程池中的常驻核心线程数
    当线程池中的线程数目达到 corePoolsize 后,就会把任务放到缓存队列中
  • maximumPoolsize:线程池中能够容纳同时执行的最大线程数
    此值必须大于等于1
  • keepAliveTime:多余的空闲线程的存活时间。
    当线程池数量超过corePoolsize时,当空闲时间达到keepAliveTime值时,多余空闲线程会被销直到只剩下corePoolsize个线程为止
  • unit:keepAliveTime的单位
  • threadFactor:表示生成线程池中工作线程的线程工厂
    用于创建线程一般用默认即可
  • handler:拒绝策略
    表示当队列满了并且工作线程大于等于线程池的最大线程数
    AboutPolicy:默认,直接抛出异常阻止系统正常运行
    CallerRunsPolicy:“调用者运行”一种调节机制,即不抛弃任务,也不会抛出异常,而是将某些任务回退到调用者
    DiscardOldestPolicy:抛弃队列中等待最久的线程,然后把当前任务加入队列中尝试再次提交任务
    DiscardPolicy:直接抛弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的方案
    以上策略均实现了RejectedExecutionHandler接口

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式创建
原因:

  • FixthreadPool和SingleThreadPool:允许请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM
  • CaChwsThreadPool和ScheduledThreadPool:允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM

自定义线程池

import java.util.concurrent.*;

/**
 * 自定义线程池
 */
public class MyThreadPoolDemo02 {
    public static void main(String[] args) {
      ExecutorService threadPool = new ThreadPoolExecutor(2,5,1L,
              TimeUnit.SECONDS,
              new LinkedBlockingDeque<Runnable>(3),
              Executors.defaultThreadFactory(),
              new ThreadPoolExecutor.DiscardPolicy());
            try {
                for (int i = 1;i<=20;i++) {
                    threadPool.execute(() -> {
                        System.out.println(Thread.currentThread().getName()+"\t 办理业务");
                    });
                    //     TimeUnit.MILLISECONDS.sleep(200);
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                threadPool.shutdown();
            }
    }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值