打字猴:1.700450859e+09
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
1700450877 编写高质量代码:改善Java程序的151个建议 [:1700438202]
1700450878 编写高质量代码:改善Java程序的151个建议 建议127:Lock与synchronized是不一样的
1700450879
1700450880 很多编码者都会说,Lock类和synchronized关键字用在代码块的并发性和内存上时语义是一样的,都是保持代码块同时只有一个线程具有执行权。这样的说法只对了一半,我们以一个任务提交给多个线程运行为例,来看看使用显式锁(Lock类)和内部锁(synchronized关键字)有什么不同。首先定义一个任务:
1700450881
1700450882 class Task{
1700450883
1700450884 public void doSomething(){
1700450885
1700450886 try{
1700450887
1700450888 //每个线程等待2秒钟,注意将此时的线程转为WAITING状态
1700450889
1700450890 Thread.sleep(2000);
1700450891
1700450892 }catch(Exception e){
1700450893
1700450894 //异常处理
1700450895
1700450896 }
1700450897
1700450898 StringBuffer sb=new StringBuffer();
1700450899
1700450900 //线程名称
1700450901
1700450902 sb.append(“线程名称:”+Thread.currentThread().getName());
1700450903
1700450904 //运行的时间戳
1700450905
1700450906 sb.append(”,执行时间:”+Calendar.getInstance().get(13)+“s”);
1700450907
1700450908 System.out.println(sb);
[ 上一页 ]  [ :1.700450859e+09 ]  [ 下一页 ]