线程池——ThreadPoolExecutor

线程池——ThreadPoolExecutor

1.构造方法
//ThreadPoolExecutor共有四个构造函数,取参数最多的为示例
ThreadPoolExecutor pool=new ThreadPoolExecutor(
    2                          //corePoolSize
    ,5                        //maximumPoolSize
    ,5000                     //keepAliveTime
    ,TimeUnit.MILLISECONDS                     //unit
    ,new LinkedBlockingQueue<Runnable>()        //workQueue
    ,Executors.defaultThreadFactory()          //threadFactory
    ,new ThreadPoolExecutor.AbortPolicy());     //handler

1.1.参数说明
序号名称类型说明
1corePoolSizeint核心线程池大小
2maximumPoolSizeint最大线程池大小
3keepAliveTimelong空闲线程最大空闲时间(超过corePoolSize的线程)
4unitTimeUnitkeepAliveTime的时间单位
5workQueueBlockingQueue线程等待队列
6threadFactoryThreadFactory线程创建工厂
7handlerRejectedExecutionHandler拒绝策略

线程大小设置

  1. 获取核心线程数:int Ncpu=Runtime.getRuntime().availableProcessors();
  2. CPU密集型(该任务需要大量的运算,而没有阻塞,CPU一直全速运行):Ncpu+1
  3. IO密集型:1.不是一直在执行:2Ncpu; 2.需要大量的IO,即大量的阻塞: Ncpu((cpu执行时间+io阻塞时间)/cpu执行时间)
1.2.workQueue(线程等待队列)
序号名称类型说明
1直接提交队列SynchronousQueue提交的任务不会被保存,总是会提交执行,每次执行插入操作就会阻塞,需要再执行删除操作才会被唤醒,反之每个删除操作也都要等待对应的插入操作;当创建的线程数大于maximumPoolSize时,执行拒绝策略
2有界任务队列ArrayBlockingQueue新的任务需要执行时,线程池会创建新的线程,直到创建的线程数量达到corePoolSize时,则会将新的任务加入到等待队列中。若等待队列已满,即超过ArrayBlockingQueue初始化的容量,则继续创建线程,直到线程数量达到maximumPoolSize设置的最大线程数量,若大于maximumPoolSize,则执行拒绝策略
3无界任务队列LinkedBlockingQueue任务队列可以无限制的添加新的任务,而线程池创建的最大线程数量就是你corePoolSize设置的数量,相当于设置的maximumPoolSize参数是无效的,哪怕你的任务队列中缓存了很多未执行的任务,当线程池的线程数达到corePoolSize后,就不会再增加了;若后续有新的任务加入,则直接进入队列等待;特别注意防止资源耗尽
4优先任务队列PriorityBlockingQueue任务按照优先级进行排序,然后按顺序执行;是一个特殊的无界任务队列
1.3.handler(拒绝策略)
序号类型说明
1AbortPolicy直接抛出异常,阻止后续运行
2CallerRunsPolicy如果线程池的线程数量达到上限,该策略会把任务队列中的任务放在调用者线程当中运行
3DiscardOledestPolicy丢弃任务队列中最老的一个任务,也就是当前任务队列中最先被添加进去的,马上要被执行的那个任务,并尝试再次提交
4DiscardPolicy丢弃无法处理的任务,不做任何处理
2.线程提交
2.1.excute()
//excute(Runnable)方法适合执行无需返回值的操作
pool.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getId()); 
            }
        });
2.2.submit()
//Callable<T>方法适合需返回值,然后执行后续操作 返回 Future<T>
Future<Object> f = pool.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getId()); 
            }
        });
Object o = f.get();
if (null == o) {
    System.out.println("未返回结果...");
} else {
    System.out.println("执行完毕,已返回结果:"+o);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
四种线程池ThreadPoolExecutor有着密切的关系。在Java中,通过Executors提供了四种线程池,这四种线程池底层都是由ThreadPoolExecutor实现的。ThreadPoolExecutor是一个灵活的线程池类,可以根据需要进行配置和定制。通过掌握ThreadPoolExecutor的参数,我们可以不局限于四种线程池,而是根据实际需求构建自己的线程池。 其中,四种线程池分别是: 1. FixedThreadPool:固定大小的线程池,线程数固定,任务被放入一个无界队列中,适用于长期执行的任务。 2. CachedThreadPool:可缓存的线程池,线程数根据需求自动增加和减少,适用于执行大量短期任务的场景。 3. SingleThreadPool:单线程的线程池,只有一个线程在工作,适用于需要保证顺序执行的任务。 4. ScheduledThreadPool:定时任务的线程池,可以设置任务的定时执行时间。 ThreadPoolExecutor提供了更加灵活的线程池管理,可以通过设置不同的参数来控制线程池的行为。例如,可以选择不同的队列策略,如无界队列LinkedBlockingQueue,来控制线程池中任务的排队方式。通过学习和使用ThreadPoolExecutor,我们可以更好地理解和使用四种线程池,同时也可以根据实际需求进行自定义的线程池构建。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JAVA线程池ThreadPoolExecutor实现的四种线程池](https://blog.csdn.net/a78270528/article/details/79881850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [Java ExecutorService四种线程池ThreadPoolExecutor机制](https://blog.csdn.net/Zzz_Zzz_Z/article/details/81218574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值