[Java四种线程池的使用](http://cuisuqiang.iteye.com/blog/2019372)
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
**(1) newCachedThreadPool**
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
Java代码
1. package test;
2. import java.util.concurrent.ExecutorService;
3. import java.util.concurrent.Executors;
4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
7. for (int i = 0; i 10; i++) {
8. final int index = i;
9. try {
10. Thread.sleep(index * 1000);
11. } catch (InterruptedException e) {
12. e.printStackTrace();
13. }
14. cachedThreadPool.execute(new Runnable() {
15. public void run() {
16. System.out.println(index);
17. }
18. });
19. }
20. }
21. }
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
Java代码
1. package test;
2. import java.util.concurrent.ExecutorService;
3. import java.util.concurrent.Executors;
4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
7. for (int i = 0; i 10; i++) {
8. final int index = i;
9. fixedThreadPool.execute(new Runnable() {
10. public void run() {
11. try {
12. System.out.println(index);
13. Thread.sleep(2000);
14. } catch (InterruptedException e) {
15. e.printStackTrace();
16. }
17. }
18. });
19. }
20. }
21. }
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
(3) newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
Java代码 ![收藏代码](http://cuisuqiang.iteye.com/images/icon_star.png)
1. package test;
2. import java.util.concurrent.Executors;
3. import java.util.concurrent.ScheduledExecutorService;
4. import java.util.concurrent.TimeUnit;
5. public class ThreadPoolExecutorTest {
6. public static void main(String[] args) {
7. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
8. scheduledThreadPool.schedule(new Runnable() {
9. public void run() {
10. System.out.println("delay 3 seconds");
11. }
12. }, 3, TimeUnit.SECONDS);
13. }
14. }
表示延迟3秒执行。
定期执行示例代码如下:
Java代码
1. package test;
2. import java.util.concurrent.Executors;
3. import java.util.concurrent.ScheduledExecutorService;
4. import java.util.concurrent.TimeUnit;
5. public class ThreadPoolExecutorTest {
6. public static void main(String[] args) {
7. ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
8. scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
9. public void run() {
10. System.out.println("delay 1 seconds, and excute every 3 seconds");
11. }
12. }, 1, 3, TimeUnit.SECONDS);
13. }
14. }
表示延迟1秒后每3秒执行一次。
(4) newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
Java代码
1. package test;
2. import java.util.concurrent.ExecutorService;
3. import java.util.concurrent.Executors;
4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
7. for (int i = 0; i 10; i++) {
8. final int index = i;
9. singleThreadExecutor.execute(new Runnable() {
10. public void run() {
11. try {
12. System.out.println(index);
13. Thread.sleep(2000);
14. } catch (InterruptedException e) {
15. e.printStackTrace();
16. }
17. }
18. });
19. }
20. }
21. }
结果依次输出,相当于顺序执行各个任务。
你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:
工具目录:**C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe**
运行程序做稍微修改:
Java代码 ![收藏代码](http://cuisuqiang.iteye.com/images/icon_star.png)
1. package test;
2. import java.util.concurrent.ExecutorService;
3. import java.util.concurrent.Executors;
4. public class ThreadPoolExecutorTest {
5. public static void main(String[] args) {
6. ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
7. for (int i = 0; i 100; i++) {
8. final int index = i;
9. singleThreadExecutor.execute(new Runnable() {
10. public void run() {
11. try {
12. while(true) {
13. System.out.println(index);
14. Thread.sleep(10 * 1000);
15. }
16. } catch (InterruptedException e) {
17. e.printStackTrace();
18. }
19. }
20. });
21. try {
22. Thread.sleep(500);
23. } catch (InterruptedException e) {
24. e.printStackTrace();
25. }
26. }
27. }
28. }
效果如下:
![](http://dl.iteye.com/upload/picture/pic/129496/a37b1415-36ac-30b8-baf6-10897bbf443a.jpg)
选择我们运行的程序:
![](http://dl.iteye.com/upload/picture/pic/129498/c518b086-b144-366c-884c-58a4bf985b05.jpg)
监控运行状态
请您到ITEYE网站看 java小强 原创,谢谢!
[http://cuisuqiang.iteye.com/](http://cuisuqiang.iteye.com/) !
自建博客地址:[http://www.javacui.com/](http://www.javacui.com/) ,内容与ITEYE同步!
- JVM
- 深入理解Java内存模型
- 深入理解Java内存模型(一)——基础
- 深入理解Java内存模型(二)——重排序
- 深入理解Java内存模型(三)——顺序一致性
- 深入理解Java内存模型(四)——volatile
- 深入理解Java内存模型(五)——锁
- 深入理解Java内存模型(六)——final
- 深入理解Java内存模型(七)——总结
- Java内存模型
- Java内存模型2
- 堆内内存还是堆外内存?
- JVM内存配置详解
- Java内存分配全面浅析
- 深入Java核心 Java内存分配原理精讲
- jvm常量池
- JVM调优总结
- JVM调优总结(一)-- 一些概念
- JVM调优总结(二)-一些概念
- VM调优总结(三)-基本垃圾回收算法
- JVM调优总结(四)-垃圾回收面临的问题
- JVM调优总结(五)-分代垃圾回收详述1
- JVM调优总结(六)-分代垃圾回收详述2
- JVM调优总结(七)-典型配置举例1
- JVM调优总结(八)-典型配置举例2
- JVM调优总结(九)-新一代的垃圾回收算法
- JVM调优总结(十)-调优方法
- 基础
- Java 征途:行者的地图
- Java程序员应该知道的10个面向对象理论
- Java泛型总结
- 序列化与反序列化
- 通过反编译深入理解Java String及intern
- android 加固防止反编译-重新打包
- volatile
- 正确使用 Volatile 变量
- 异常
- 深入理解java异常处理机制
- Java异常处理的10个最佳实践
- Java异常处理手册和最佳实践
- Java提高篇——对象克隆(复制)
- Java中如何克隆集合——ArrayList和HashSet深拷贝
- Java中hashCode的作用
- Java提高篇之hashCode
- 常见正则表达式
- 类
- 理解java类加载器以及ClassLoader类
- 深入探讨 Java 类加载器
- 类加载器的工作原理
- java反射
- 集合
- HashMap的工作原理
- ConcurrentHashMap之实现细节
- java.util.concurrent 之ConcurrentHashMap 源码分析
- HashMap的实现原理和底层数据结构
- 线程
- 关于Java并发编程的总结和思考
- 40个Java多线程问题总结
- Java中的多线程你只要看这一篇就够了
- Java多线程干货系列(1):Java多线程基础
- Java非阻塞算法简介
- Java并发的四种风味:Thread、Executor、ForkJoin和Actor
- Java中不同的并发实现的性能比较
- JAVA CAS原理深度分析
- 多个线程之间共享数据的方式
- Java并发编程
- Java并发编程(1):可重入内置锁
- Java并发编程(2):线程中断(含代码)
- Java并发编程(3):线程挂起、恢复与终止的正确方法(含代码)
- Java并发编程(4):守护线程与线程阻塞的四种情况
- Java并发编程(5):volatile变量修饰符—意料之外的问题(含代码)
- Java并发编程(6):Runnable和Thread实现多线程的区别(含代码)
- Java并发编程(7):使用synchronized获取互斥锁的几点说明
- Java并发编程(8):多线程环境中安全使用集合API(含代码)
- Java并发编程(9):死锁(含代码)
- Java并发编程(10):使用wait/notify/notifyAll实现线程间通信的几点重要说明
- java并发编程-II
- Java多线程基础:进程和线程之由来
- Java并发编程:如何创建线程?
- Java并发编程:Thread类的使用
- Java并发编程:synchronized
- Java并发编程:Lock
- Java并发编程:volatile关键字解析
- Java并发编程:深入剖析ThreadLocal
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
- Synchronized与Lock
- JVM底层又是如何实现synchronized的
- Java synchronized详解
- synchronized 与 Lock 的那点事
- 深入研究 Java Synchronize 和 Lock 的区别与用法
- JAVA编程中的锁机制详解
- Java中的锁
- TreadLocal
- 深入JDK源码之ThreadLocal类
- 聊一聊ThreadLocal
- ThreadLocal
- ThreadLocal的内存泄露
- 多线程设计模式
- Java多线程编程中Future模式的详解
- 原子操作(CAS)
- [译]Java中Wait、Sleep和Yield方法的区别
- 线程池
- 如何合理地估算线程池大小?
- JAVA线程池中队列与池大小的关系
- Java四种线程池的使用
- 深入理解Java之线程池
- java并发编程III
- Java 8并发工具包漫游指南
- 聊聊并发
- 聊聊并发(一)——深入分析Volatile的实现原理
- 聊聊并发(二)——Java SE1.6中的Synchronized
- 文件
- 网络
- index
- 内存文章索引
- 基础文章索引
- 线程文章索引
- 网络文章索引
- IOC
- 设计模式文章索引
- 面试
- Java常量池详解之一道比较蛋疼的面试题
- 近5年133个Java面试问题列表
- Java工程师成神之路
- Java字符串问题Top10
- 设计模式
- Java:单例模式的七种写法
- Java 利用枚举实现单例模式
- 常用jar
- HttpClient和HtmlUnit的比较总结
- IO
- NIO
- NIO入门
- 注解
- Java Annotation认知(包括框架图、详细介绍、示例说明)