打字猴:1.700450827e+09
1700450827
1700450828 return””;
1700450829
1700450830 }
1700450831
1700450832 });
1700450833
1700450834 //获得任务执行后的返回值
1700450835
1700450836 System.out.println(“返回值:”+future.get());
1700450837
1700450838 //关闭执行器
1700450839
1700450840 es.shutdown();
1700450841
1700450842 }
1700450843
1700450844 newCachedThreadPool:缓冲功能的线程池。
1700450845
1700450846 建立了一个线程池,而且线程数量是没有限制的(当然,不能超过Integer的最大值),新增一个任务即有一个线程处理,或者复用之前空闲的线程,或者新启动一个线程,但是一旦一个线程在60秒内一直是出于等待状态时(也就是1分钟没工作可做),则会被终止,其源代码如下。
1700450847
1700450848 public static ExecutorService newCachedThreadPool(){
1700450849
1700450850 return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L, TimeUnit.SECONDS, new
1700450851
1700450852 SynchronousQueue<Runnable>());
1700450853
1700450854 }
1700450855
1700450856 这里需要说明的是,任务队列使用了同步阻塞队列,这意味着向队列中加入一个元素,即可唤醒一个线程(新创建的线程或复用池中空闲线程)来处理,这种队列已经没有队列深度的概念了。
1700450857
1700450858 newFixedThreadPool:固定线程数量的线程池。
1700450859
1700450860 在初始化时已经决定了线程的最大数量,若任务添加的能力超出了线程处理能力,则建立阻塞队列容纳多余的任务,源代码如下:
1700450861
1700450862 public static ExecutorService newFixedThreadPool(int nThreads){
1700450863
1700450864 return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS, new
1700450865
1700450866 LinkedBlockingQueue<Runnable>());
1700450867
1700450868 }
1700450869
1700450870 上面返回的是一个ThreadPoolExecutor,它的corePoolSize和maximumPoolSize是相等的,也就是说,最大线程数量也是nThreads。如果任务增长速度非常快,超过了LinkedBlockingQueue的最大容量(Integer的最大值),那此时会如何处理呢?会按照ThreadPoolExecutor默认的拒绝策略(默认是DiscardPolicy,直接丢弃)来处理。
1700450871
1700450872 以上三种线程池执行器都是ThreadPoolExecutor的简化版,目的是帮助开发人员屏蔽过多的线程细节,简化多线程开发。当需要运行异步任务时,可以直接通过Executors获得一个线程池,然后运行任务,不需要关注ThreadPoolExecutor的一系列参数是什么含义。当然,有时候这三个线程池不能满足要求,此时则可以直接操作ThreadPoolExecutor来实现复杂的多线程运算。可以这样来比喻:newSingleThreadExecutor、newCachedThreadPool、newFixedThreadPool是线程池的简化版,而ThreadPoolExecutor则是旗舰版—简化版更容易操作,需要了解的知识相对少些,方便实用,而且旗舰版功能齐全,适用面广,但难于驾驭。
1700450873
1700450874
1700450875
1700450876
[ 上一页 ]  [ :1.700450827e+09 ]  [ 下一页 ]