JUC 之 线程池的创建

目录

一:线程池的好处

二:线程池三大方法

三:七大参数

四:四大策略


相信大家对线程池也有一定的了解,在这里我就不过多的赘述了

线程池中有:三大方法、七大参数、四种拒绝策略

一:线程池的好处

  1. 降低了资源的消耗
  2. 方便管理
  3. 提高了我们的相应速度

二:线程池三大方法

我们线程池中有三大方法,在这里我给大家来讲解一

ExecutorService threadPool = Executors.newSingleThreadExecutor();//单个线程,这个线程池只有一个线程
ExecutorService threadPool =  Executors.newFixedThreadPool(5);//创建一个固定的线程池的大小
ExecutorService threadPool =Executors.newCachedThreadPool();//缓存,就是可伸缩的,遇强贼强,遇弱则弱

但是这三种方法创建线程池都是有弊端的,最主要的就是OOM,通过阅读阿里巴巴开发手册我们可以知道

所以我们要通过TreadPoolExecutor的方式来创建线程池。

来看一段TreadPoolExecutor的方式来创建线程池的源码:

    public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             threadFactory, defaultHandler);
    }

三:七大参数

通过上文的源码中我们可知,使用TreadPoolExecutor来创建线程池的时候,需要有七个参数

  1. int corePoolSize  核心线程数
  2. int maximumPoolSize  最大线程数
  3. long keepAliveTime空闲线程最大存活时间
  4. TimeUnit unit 时间单位
  5. BlockingQueue<Runnable> workQueue  任务队列
  6. ThreadFactory threadFactory  创建线程工厂
  7. 任务的拒绝策略(四个)

下面我们通过代码使用TreadPoolExecutor来创建线程池

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    2,//核心线程
    5,//最大线程数
    3,
    TimeUnit.SECONDS,
    new LinkedBlockingQueue<>(3),
    Executors.defaultThreadFactory(),//线程工厂
//  new ThreadPoolExecutor.AbortPolicy()//拒绝策略//满了还有人进来,不处理这个人的,抛出异常,这个是中止策略,超出最大值(最大线程数+等待队列),就会RejectedExecutionException
//  new ThreadPoolExecutor.CallerRunsPolicy()//哪里来的去哪里,
//  new ThreadPoolExecutor.DiscardPolicy()//队列满了,不会抛出异常,队列满了,丢掉任务
    new ThreadPoolExecutor.DiscardOldestPolicy()//替换旧的,队列满了,尝试和占用时间最久的竞争,也不会抛出异常
        );

四:四大策略

  1. new ThreadPoolExecutor.AbortPolicy()  丢弃任务并抛出RejectedExecutionException异常,是默认的策略。
  2. new ThreadPoolExecutor.DiscardPolicy()  丢弃任务,但是不会抛出异常,这是不推荐的做法
  3. new ThreadPoolExecutor.DiscardOldestPolicy()   抛弃队列中等待最久的任务,然后把当前任务加入到队列中
  4. new ThreadPoolExecutor.CallerRunsPolicy()  调用任务的run()方法绕过线程池去执行

总结:

1.cpu密集型  我的电脑是8核处理器,几核cpu就定义为几,这样可以保证cpu效率最高System.out.println(Runtime.getRuntime().availableProcessors());//获取本机中cpu的核数
2.IO  密集型 密集型->判断你程序中十分消耗IO的线程
  程序 15个大型任务  io十分占用资源,用他的两倍来定义最大线程

以上就是我对创建线程池的理解,不对的地方还请多多指正,谢谢大家的阅读。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉锵T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值