为什么80%的码农都做不了架构师?>>>   

1.CachedThreadPool

CachedThreadPool首先会按照需要创建足够多的线程来执行任务(Task)。随着程序执行的过程,有的线程执行完了任务,可以被重新循环使用时,才不再创建新的线程来执行任务。我们采用《Thinking In Java》中的例子来分析。

首先,任务定义如下(实现了Runnable接口,并且复写了run方法):

Java代码  
  1. package net.jerryblog.concurrent;
  2. public class LiftOff implements Runnable{
  3. protected int countDown = 10; //Default
  4. private static int taskCount = 0;
  5. private final int id = taskCount++;
  6. public LiftOff() {}
  7. public LiftOff(int countDown) {
  8. this.countDown = countDown;
  9. }
  10. public String status() {
  11. return "#" + id + "(" +
  12. (countDown > 0 ? countDown : "LiftOff!") + ") ";
  13. }
  14. @Override
  15. public void run() {
  16. while(countDown-- > 0) {
  17. System.out.print(status());
  18. Thread.yield();
  19. }
  20. }
  21. }

采用CachedThreadPool方式执行编写的客户端程序如下:

Java代码  
  1. package net.jerryblog.concurrent;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class CachedThreadPool {
  5. public static void main(String[] args) {
  6. ExecutorService exec = Executors.newCachedThreadPool();
  7. for(int i = 0; i < 10; i++) {
  8. exec.execute(new LiftOff());
  9. }
  10. exec.shutdown();
  11. }
  12. }

上面的程序中,有10个任务,采用CachedThreadPool模式,exec没遇到一个LiftOff的对象(Task),就会创建一个线程来处理任务。现在假设遇到到第4个任务时,之前用于处理第一个任务的线程已经执行完成任务了,那么不会创建新的线程来处理任务,而是使用之前处理第一个任务的线程来处理这第4个任务。接着如果遇到第5个任务时,前面那些任务都还没有执行完,那么就会又新创建线程来执行第5个任务。否则,使用之前执行完任务的线程来处理新的任务。

2.FixedThreadPool

FixedThreadPool模式会使用一个优先固定数目的线程来处理若干数目的任务。规定数目的线程处理所有任务,一旦有线程处理完了任务就会被用来处理新的任务(如果有的话)。这种模式与上面的CachedThreadPool是不同的,CachedThreadPool模式下处理一定数量的任务的线程数目是不确定的。而FixedThreadPool模式下最多 的线程数目是一定的。

采用FixedThreadPool模式编写客户端程序如下:

Java代码  
  1. package net.jerryblog.concurrent;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class FixedThreadPool {
  5. public static void main(String[] args) {
  6. //三个线程来执行五个任务
  7. ExecutorService exec = Executors.newFixedThreadPool(3);
  8. for(int i = 0; i < 5; i++) {
  9. exec.execute(new LiftOff());
  10. }
  11. exec.shutdown();
  12. }
  13. }

3.SingleThreadExecutor模式

SingleThreadExecutor模式只会创建一个线程。它和FixedThreadPool比较类似,不过线程数是一个。如果多个任务被提交给SingleThreadExecutor的话,那么这些任务会被保存在一个队列中,并且会按照任务提交的顺序,一个先执行完成再执行另外一个线程。

SingleThreadExecutor模式可以保证只有一个任务会被执行。这种特点可以被用来处理共享资源的问题而不需要考虑同步的问题。

SingleThreadExecutor模式编写的客户端程序如下:

Java代码  
  1. package net.jerryblog.concurrent;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class SingleThreadExecutor {
  5. public static void main(String[] args) {
  6. ExecutorService exec = Executors.newSingleThreadExecutor();
  7. for (int i = 0; i < 2; i++) {
  8. exec.execute(new LiftOff());
  9. }
  10. }
  11. }

这种模式下执行的结果如下:

Java代码  
  1. #0(9) #0(8) #0(7) #0(6) #0(5) #0(4) #0(3) #0(2) #0(1) #0(LiftOff!)
  2. #1(9) #1(8) #1(7) #1(6) #1(5) #1(4) #1(3) #1(2) #1(1) #1(LiftOff!)

第一个任务执行完了之后才开始执行第二个任务。

转  http://wawlian.iteye.com/blog/1315256

转载于:https://my.oschina.net/huqiji/blog/799329

Java并发包中的几种ExecutorService相关推荐

  1. 第 5-6 课:Java 并发包中的高级同步工具 + 面试题

    Java 中的并发包指的是 java.util.concurrent(简称 JUC)包和其子包下的类和接口,它为 Java 的并发提供了各种功能支持,比如: 提供了线程池的创建类 ThreadPool ...

  2. java循环控制语句,简述Java流程控制语句中的三种循环控制语句,并描述下它们的区别。...

    简述Java流程控制语句中的三种循环控制语句,并描述下它们的区别. 答:for语句,构建确定循环次数的循环结构 while语句,通常构建不确定循环次数的循环结构 do-while语句,通常构建不确定循 ...

  3. Java并发包中常用类

    Java并发包中常用类小结(一) 从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来简单看一下相关的一些常见类的使用情况. 1.Concurren ...

  4. Java并发包中常用类小结(一)

                                   Java并发包中常用类小结(一) 从JDK1.5以后,Java为我们引入了一个并发包,用于解决实际开发中经常用到的并发问题,那我们今天就来 ...

  5. Java并发包中Semaphore的工作原理、源码分析及使用示例

    简介: 在多线程程序设计中有三个同步工具需要我们掌握,分别是Semaphore(信号量),countDownLatch(倒计数门闸锁),CyclicBarrier(可重用栅栏) 欢迎探讨,如有错误敬请 ...

  6. 并发编程笔记——第六章 Java并发包中锁原理剖析

    一.LockSupport工具类 JDK中的rt.jar包里的LockSupport是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础.LockSupport类与每个使用它的 ...

  7. java级别_Java中的四种访问级别

    在Java中,针对类.成员方法和属性提供了四种访问级别,分别是private.default.protected和public.接下来通过一个图将这四种控制级别由小到大依次列出,如图1所示. 图1 访 ...

  8. Java和ABAP中的几种引用类型的分析和比较

    Java编程语言中几种不同的引用类型是面试时经常容易被问到的问题:强引用,软引用,弱引用,虚引用. 其实除了Java之外,某些 其他编程语言也有类似概念,比如ABAP.今天我们就来比较一下. 根据AB ...

  9. map java 用法_java中map 9种常规用法

    通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的.下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题. 0.将Map转换为List类型 在java中Map接口提 ...

最新文章

  1. php网站怎么伪静态,php怎么实现网页伪静态
  2. 教程-Delphi编译就报毒
  3. HTML5音乐播放器(四):播放列表与播放方式
  4. 从一个页面跳转到用swiper写的全屏滚动页面的指定位置
  5. Nginx负载均衡状态之down
  6. Mango Teapot ② Teapot クラス
  7. 第七节:语法总结(1)(自动属性、out参数、对象初始化器、var和dynamic等)
  8. Python编程中一些异常处理的小技巧
  9. BugkuCTF-WEB题cookie欺骗
  10. 语音识别介绍(上篇)
  11. 宏转录组方法_高级转录组分析和R语言数据可视化第12期 (线上线下同时开课)
  12. Qt将GeoJson文件转为mif文件的示例
  13. webstorm汉化攻略
  14. 学习银行转账系统-代码摘取csdn
  15. java输入日期计算天数_Java输入日期得到天数
  16. 图形虚拟化技术为每个英特尔®显卡家族提供支持
  17. Linux: vi 编辑器
  18. python 库的安装(cmd+pip)
  19. 使用MfgTool工具进行系统烧写
  20. Neat Reader安装使用

热门文章

  1. 【译】Asp.net MVC 利用自定义RouteHandler来防止图片盗链 (转)
  2. 设计模式第七讲-责任链模式
  3. springboot配置国际化资源文件 使用themself模板进行解析
  4. 重要通知 | WanaCrypt0r 2.0及Onion等勒索软件安全建议
  5. SQLSERVER监控复制并使用数据库邮件功能发告警邮件
  6. 总结ISO各层协议都有哪些
  7. inner join on, left join on, right join on要详细点的介绍?内连接,左外连接,右外连接。...
  8. 在同一台电脑上同时使用IE6和IE7
  9. 利用存储过程得到某一指定的表与其它的表之间的外键关系SQL Server2000
  10. es了解集群中属性 4