打字猴:1.700450789e+09
1700450789
1700450790 线程池的管理是这样一个过程:首先创建线程池,然后根据任务的数量逐步将线程增大到corePoolSize数量,如果此时仍有任务增加,则放置到workQueue中,直到workQueue爆满为止,然后继续增加池中的线程数量(增强处理能力),最终达到maximumPoolSize,那如果此时还有任务要增加进来呢?这就需要handler来处理了,或者丢弃新任务,或者拒绝新任务,或者挤占已有任务等。
1700450791
1700450792 在任务队列和线程池都饱和的情况下,一旦有线程处于等待(任务处理完毕,没有新任务增加)状态的时间超过keepAliveTime,则该线程终止,也就是说池中的线程数量会逐渐降低,直至为corePoolSize数量为止。
1700450793
1700450794 我们可以把线程池想象成这样一个场景:在一条生产线上,车间规定是可以有corePoolSize数量的工人,但是生产线刚建立时,工作不多,不需要那么多的人。随着工作数量的增加,工人数量也逐渐增加,直至增加到corePoolSize数量为止,此时任务还在增加,那怎么办呢?
1700450795
1700450796 好办,任务排队,corePoolSize数量的工人不停歇地处理任务,新增加的任务按照一定的规则存放在仓库中(也就是我们的workQueue中),一旦任务增加的速度超过了工人处理的能力,也就是说仓库爆满时,车间就会继续招聘工人(也就是扩大线程数),直至工人数量达到maximumPoolSize为止,那如果所有的maximumPoolSize工人都在处理任务,而且仓库也是饱和状态,新增任务的该怎么处理呢?这就会扔给一个叫handler的专门机构去处理了,它要么丢弃这些新增的任务,要么无视,要么替换掉别的任务。
1700450797
1700450798 过了一段时间后,任务的数量逐渐减少了,导致有一部分工人处以待工状态,为了减少开支(Java是为了减少系统资源消耗),于是开始辞退工人,直至保持为corePoolSize数量的工人为止,此时即使没有工作,也不再辞退工人(池中线程数量不再减少),这也是为了保证以后再有任务时能够快速的处理。
1700450799
1700450800 明白了线程池的概念,我们再来看Executors提供的几个创建线程池的便捷方法:
1700450801
1700450802 newSingleThreadExecutor:单线程池。
1700450803
1700450804 顾名思义就是一个池中只有一个线程在运行,该线程永不超时。而且由于是一个线程,当有多个任务需要处理时,会将它们放置到一个无界阻塞队列中逐个处理,它的实现代码如下:
1700450805
1700450806 public static ExecutorService newSingleThreadExecutor(){
1700450807
1700450808 return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,1,0L,
1700450809
1700450810 TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));
1700450811
1700450812 }
1700450813
1700450814 它的使用方法也非常简单,下面是简单的示例:
1700450815
1700450816 public static void main(String[]args)throws Exception{
1700450817
1700450818 //创建单线程执行器
1700450819
1700450820 ExecutorService es=Executors.newSingleThreadExecutor();
1700450821
1700450822 //执行一个任务
1700450823
1700450824 Future<String>future=es.submit(new Callable<String>(){
1700450825
1700450826 public String call()throws Exception{
1700450827
1700450828 return””;
1700450829
1700450830 }
1700450831
1700450832 });
1700450833
1700450834 //获得任务执行后的返回值
1700450835
1700450836 System.out.println(“返回值:”+future.get());
1700450837
1700450838 //关闭执行器
[ 上一页 ]  [ :1.700450789e+09 ]  [ 下一页 ]