多线程:线程池的选择

Java的线程池从最根本来讲只有两个ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,他们两个是父子关系,为了简化并行计算,还提供了一个Executors的静态类,它可以直接生成多种不同的线程池执行器,比如单线程执行器,带缓冲功能的执行器,但归根结底还是ThreadPoolExecutor或者ScheduledThreadPoolExecutor类的封装类。

线程池的管理是这样一个过程: 首先创建线程池 然后根据任务的数量逐步将线程增大到corePoolSize数量,如果此时仍有任务增加,则放置到workQueue中,知道workQueue爆满为止。 然后继续增加池中线程的数量(增强处理能力),最终达到maximumPoolSize 如果此时还有任务要进来,那么就需要handler来处理,或者丢弃新任务,或者拒绝新任务,或者挤占已有的任务。

在任务队列和线程池都饱和的情况下,一旦有线程处于等待(任务处理完毕,没有任务增加)状态的时间超过KeepAliveTime,则线程终止。也就是说线程池中线程的数量逐渐降低为corePoolSize的大小,

线程池可以看作是:在一条生产线上,车间规定有corePoolSize的数量的工人,但是生产线刚建立的时候,工作不多,不需要那么多的人,随着工作数量的增加,直至增加到CorePoolSize数量为止,此时任务还在增加,那该怎么办? 好办!任务排队,coerpoolsize数量的工人不停歇的处理任务,新增加的任务按照一定的规则存放在仓库中(也就是我们的workQueue中),一旦任务的增加速度超过了工人的处理速度,也就是说仓库爆满的时候,那么工厂就会继续招收工人(也就是扩大线程数)直至工人数量达到maxiumaPoolSize为止,那如果所有的maxiumPoolSize工人都在处理任务,而仓库也是饱和状态。新增的任务怎么办?这时候就会扔给一个叫做handler的专门机构去处理了,它要么丢弃这些新增的任务,要么无视,要么替换别的任务。

过一段时间后,任务的数量减少,导致了一部分工人处于待工状态,为了减少开支(Java为了减少系统资源消耗),于是开始辞退工人,直至保存到corePoolSize数量的工人为止,此时即使没有工作,也不再辞退工人(池中线程数量不再减少),这也是为了保存以后再有任务时能够快速处理。

明白了线程池之后,再来看Executors提供的几个创建线程池的简单方法。 newSingleTreadExecutor;单线程池 故名思义,一个池中只有一个线程在运行,该线程永不超时,而且由于是一个线程,当有多个任务需要处理的时候,会将他们放到一个无解阻塞队列中逐个处理。它的代码使用实例如下: <!--- lang:java --> public static void main(String[] args) throws Exception{ // 创建单线程执行器 ExecutorService es = Executors.newSingleThreadExecutor(); // 执行一个任务 Future<String> future = es.submit(new Callable<String>() { @Override public String call() throws Exception { // TODO Auto-generated method stub return ""; } }); // 获得任务执行后的返回值 System.out.println("返回值" + future.get()); es.shutdown(); }

newCachedThreadPool,缓冲功能的线程池, 建立了一个线程池,而线程的数量是没有限制的(当然不能超过Integer的最大值)。新增一个任务即有一个线程处理,或者复用之前空闲的线程,或者重新启动一个线程。但是一旦一个线程在六十秒内一直处于等待状态时,也就是说一分钟内没有工作可做,则会被终止,在这里需要说明的是。任务队列采用了同步阻塞队列。这意味着向队列中加入一个元素,即可以唤醒一个线程(新创建的线程或服用池中空闲的线程)来处理。这种队列已经没有队列深度的概念。

newFixedThreadPool:固定数量的线程池。 在初始化时已经决定了线程的最大数量。若任务添加已经超过了线程处理能力,则建立阻塞队列来容纳多余的任务。

这三种线程池执行器都是ThreadPoolExeCutor的简化版,目的在于帮助开发人员屏蔽过多的线程细节,简化线程开发。当需要运行异步任务时,可以直接通过executors获的线程池,然后运行任务,不需要关注ThreadPoolExecutor中一系列参数的含义,当然,有时候这三个不一定能够满足条件。此时可以直接操作ThreadPoolExeCutors来实现复杂的多线程操作。

转载于:https://my.oschina.net/sudojs/blog/288129

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值