Java通过Executors提供四种线程池
http://cuisuqiang.iteye.com/blog/2019372
Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
(1) newCachedThreadPool
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。示例代码如下:
- package test;
 - import java.util.concurrent.ExecutorService;
 - import java.util.concurrent.Executors;
 - public class ThreadPoolExecutorTest {
 - public static void main(String[] args) {
 - ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
 - for (int i = 0; i < 10; i++) {
 - final int index = i;
 - try {
 - Thread.sleep(index * 1000);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - cachedThreadPool.execute(new Runnable() {
 - public void run() {
 - System.out.println(index);
 - }
 - });
 - }
 - }
 - }
 
线程池为无限大,当执行第二个任务时第一个任务已经完成,会复用执行第一个任务的线程,而不用每次新建线程。
 
(2) newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。示例代码如下:
- package test;
 - import java.util.concurrent.ExecutorService;
 - import java.util.concurrent.Executors;
 - public class ThreadPoolExecutorTest {
 - public static void main(String[] args) {
 - ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
 - for (int i = 0; i < 10; i++) {
 - final int index = i;
 - fixedThreadPool.execute(new Runnable() {
 - public void run() {
 - try {
 - System.out.println(index);
 - Thread.sleep(2000);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - }
 - });
 - }
 - }
 - }
 
因为线程池大小为3,每个任务输出index后sleep 2秒,所以每两秒打印3个数字。
定长线程池的大小最好根据系统资源进行设置。如Runtime.getRuntime().availableProcessors()
(3)  newScheduledThreadPool
创建一个定长线程池,支持定时及周期性任务执行。延迟执行示例代码如下:
- package test;
 - import java.util.concurrent.Executors;
 - import java.util.concurrent.ScheduledExecutorService;
 - import java.util.concurrent.TimeUnit;
 - public class ThreadPoolExecutorTest {
 - public static void main(String[] args) {
 - ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
 - scheduledThreadPool.schedule(new Runnable() {
 - public void run() {
 - System.out.println("delay 3 seconds");
 - }
 - }, 3, TimeUnit.SECONDS);
 - }
 - }
 
表示延迟3秒执行。
定期执行示例代码如下:
- package test;
 - import java.util.concurrent.Executors;
 - import java.util.concurrent.ScheduledExecutorService;
 - import java.util.concurrent.TimeUnit;
 - public class ThreadPoolExecutorTest {
 - public static void main(String[] args) {
 - ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
 - scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 - public void run() {
 - System.out.println("delay 1 seconds, and excute every 3 seconds");
 - }
 - }, 1, 3, TimeUnit.SECONDS);
 - }
 - }
 
表示延迟1秒后每3秒执行一次。
(4) newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。示例代码如下:
- package test;
 - import java.util.concurrent.ExecutorService;
 - import java.util.concurrent.Executors;
 - public class ThreadPoolExecutorTest {
 - public static void main(String[] args) {
 - ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
 - for (int i = 0; i < 10; i++) {
 - final int index = i;
 - singleThreadExecutor.execute(new Runnable() {
 - public void run() {
 - try {
 - System.out.println(index);
 - Thread.sleep(2000);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - }
 - });
 - }
 - }
 - }
 
结果依次输出,相当于顺序执行各个任务。
你可以使用JDK自带的监控工具来监控我们创建的线程数量,运行一个不终止的线程,创建指定量的线程,来观察:
工具目录:C:\Program Files\Java\jdk1.6.0_06\bin\jconsole.exe
运行程序做稍微修改:
- package test;
 - import java.util.concurrent.ExecutorService;
 - import java.util.concurrent.Executors;
 - public class ThreadPoolExecutorTest {
 - public static void main(String[] args) {
 - ExecutorService singleThreadExecutor = Executors.newCachedThreadPool();
 - for (int i = 0; i < 100; i++) {
 - final int index = i;
 - singleThreadExecutor.execute(new Runnable() {
 - public void run() {
 - try {
 - while(true) {
 - System.out.println(index);
 - Thread.sleep(10 * 1000);
 - }
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - }
 - });
 - try {
 - Thread.sleep(500);
 - } catch (InterruptedException e) {
 - e.printStackTrace();
 - }
 - }
 - }
 - }
 
效果如下:

选择我们运行的程序:

监控运行状态
Java通过Executors提供四种线程池的更多相关文章
- Executors创建四种线程池
		
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixedThreadPool 创建一个定长线程池,可控制线程 ...
 - java自带的四种线程池
		
java预定义的哪四种线程池? newSingleThreadExexcutor:单线程数的线程池(核心线程数=最大线程数=1) newFixedThreadPool:固定线程数的线程池(核心线程数= ...
 - Java中常用的四种线程池
		
在Java中使用线程池,可以用ThreadPoolExecutor的构造函数直接创建出线程池实例,如何使用参见之前的文章Java线程池构造参数详解.不过,在Executors类中,为我们提供了常用线程 ...
 - Executors的四种线程池
		
Executors.newCachedThreadPool(); Executors.newFixedThreadPool(2); Executors.newScheduledThreadPool(2 ...
 - Executors提供的四种线程池和自定义线程池
		
JAVA并发编程——EXECUTORS 线程池的思想是一种对象池的思想,开放一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完毕,对象 ...
 - Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
		
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
 - Java四种线程池的使用
		
Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程.newFixe ...
 - Java四种线程池
		
Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...
 - Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor
		
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void ru ...
 
随机推荐
- Java中的Comparable<T>和Comparator<T>接口
			
有的时候在面试时会被问到Comparable<T>和Comparator<T>的区别(或者Java中两种排序功能的实现区别). 1) 在使用普通数组的时候,如果想对数据进行排序 ...
 - lower_bound 和 upper_bound
			
Return iterator to lower bound Returns an iterator pointing to the first element in the range [first ...
 - POJ 2396 Budget【网络流】
			
题意: cas //测试数据组数 n m //行数 列数 a1 a2 ... an //每行的和 b1 b2 ... bn //每列的和 q ...
 - [HDU 2602]Bone Collector ( 0-1背包水题 )
			
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 水题啊水题 还给我WA了好多次 因为我在j<w[i]的时候状态没有下传.. #includ ...
 - linux下udp编程
			
#include<sys/types.h> #include<sys/socket.h> #include<unistd.h> #include<netine ...
 - some tips
			
1.在使用selenium的时候,需要等待页面加载完成,特别是一些ajax请求,最好使用以下方法(python),通过document.readyState来判断 from selenium.webd ...
 - (续篇3):飞测独家のJmeter秘籍,限量发放
			
好东西,分享大家,自上次分享出来fiddler导出jmx格式V4.0版本对外公开后,收到一些反馈,我们利用工作之余时间继续优化,现在一个比较稳定的版本出炉,分享给大伙,我们一起来看看. 特性说明: 版 ...
 - linux下的mysql乱码问题
			
1,承接上一随笔,因为我用的是rmp的两种反式. rpm -ivh MySQL-server-4.0.14-0.i386.rpm rpm -ivh MySQL-client-4.0.14-0.i386 ...
 - 【Hibernate 8】Hibernate的调优方法:抓取策略
			
在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetchin ...
 - adb调试命令详解-2016.02.01
			
adb(Android Debug Bridge),调试桥可以让设备的调试监测过程在远端进行,而不必在运行实际运行应用的设备上,方便调试的输出. 1 命令详解 a 查看帮助信息 adb ...