Java自带的线程池Executors.newFixedThreadPool
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。
在Java5之前,要实现一个线程池是相当有难度的,现在Java5为我们做好了一切,我们只需要按照提供的API来使用,即可享受线程池带来的极大便利。
Java5的线程池分好多种:具体的可以分为两类,固定尺寸的线程池、可变尺寸连接池。
在使用线程池之前,必须知道如何去创建一个线程池,在Java5中,需要了解的是java.util.concurrent.Executors类的API,这个类提供大量创建连接池的静态方法,是必须掌握的。
一、固定大小的线程池,newFixedThreadPool:
class TestThread extends Thread {private String flag;public TestThread(String flag) {this.flag = flag;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在执行。。。" + flag);}
}
@Testpublic void fixedThreadPoolTest() {// 创建一个可重用固定线程数的线程池ExecutorService pool = Executors.newFixedThreadPool(5);// 创建线程Thread t1 = new TestThread("111");Thread t2 = new TestThread("222");Thread t3 = new TestThread("333");Thread t4 = new TestThread("444");Thread t5 = new TestThread("555");// 将线程放入池中进行执行pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);// 关闭线程池pool.shutdown();}
输出结果:
pool-1-thread-1正在执行。。。111
pool-1-thread-3正在执行。。。333
pool-1-thread-2正在执行。。。222
pool-1-thread-4正在执行。。。444
pool-1-thread-5正在执行。。。555
改变ExecutorService pool = Executors.newFixedThreadPool(5)中的参数:ExecutorService pool = Executors.newFixedThreadPool(2),输出结果是:
pool-1-thread-1正在执行。。。111
pool-1-thread-2正在执行。。。222
pool-1-thread-2正在执行。。。333
pool-1-thread-1正在执行。。。444
pool-1-thread-2正在执行。。。555
从以上结果可以看出,newFixedThreadPool的参数指定了可以运行的线程的最大数目,超过这个数目的线程加进去以后,不会立即运行,而是被放入任务队列中等待执行。其次,加入线程池的线程属于托管状态,线程的运行不受加入顺序的影响。
二、单任务线程池,newSingleThreadExecutor:
仅仅是把上述代码中的ExecutorService pool = Executors.newFixedThreadPool(2)改为ExecutorService pool = Executors.newSingleThreadExecutor();
@Testpublic void singleThreadPoolTest() {// 创建一个单任务线程池ExecutorService pool = Executors.newSingleThreadExecutor();// 创建线程Thread t1 = new TestThread("111");Thread t2 = new TestThread("222");Thread t3 = new TestThread("333");Thread t4 = new TestThread("444");Thread t5 = new TestThread("555");// 将线程放入池中进行执行pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);// 关闭线程池pool.shutdown();}
输出结果:
pool-1-thread-1正在执行。。。111
pool-1-thread-1正在执行。。。222
pool-1-thread-1正在执行。。。333
pool-1-thread-1正在执行。。。444
pool-1-thread-1正在执行。。。555
可以看出,每次调用execute方法,其实最后都是调用了thread-1的run方法。
也可以这样使用
@Testpublic void easyMethod() {ExecutorService pool = Executors.newFixedThreadPool(2);pool.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("execute method1");}});pool.execute(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("execute method2");}});pool.shutdown();}
Java自带的线程池Executors.newFixedThreadPool相关推荐
- 线程池Executors.newFixedThreadPool验证以及总结
1.Executors在于java.util.comcurrent.包下,Executors.newFixedThreadPool(n)创建容器大小为n的线程池,表示正在执行中的线程只有n个, 实践代 ...
- 线程池Executors.newFixedThreadPool
转载至::. https://blog.csdn.net/bobo8945510/article/details/52135076 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池 ...
- Java自带的线程池ThreadPoolExecutor详细介绍说明和实例运用
Java 5 开始,Java 提供了自己的线程池.线程池就是一个线程的容器,每次只执行额定数量的线程. java.util.concurrent.ThreadPoolExecutor 就是这样的线程池 ...
- 深入理解Java自带的线程池和缓冲队列
https://www.cnblogs.com/xiguadadage/p/10243332.html
- java executors 详解_线程池—Executors 详解
各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 线 ...
- 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )
文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...
- Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool
Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool 一.线程池的理 ...
- java高级应用:线程池全面解析
什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我们知道不用线程池 ...
- 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )
文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...
最新文章
- Android 通用流行框架大全
- 【JDK源码】java.io包常用类详解
- telnet后为啥打开的时防火墙_以前用散煤取暖时,农民很大方,换上天然气后就“蔫了”,为啥?...
- Apache配置SSL证书指引
- 重新开始我的blog内容!
- 3D视觉(二)四元数简要说明
- CSF 格式文件播放器 下载地址
- 各大搜索引擎站点提交入口大全
- 《NAT穿越(NAT-T)RFC3947文档》记录
- 【软硬件基础】X86和X64
- 游戏党福音,Google play游戏明年登录Windows
- android 手电筒开发
- 整除/ 与 求余% 运算
- 转帖【编码原则十日谈】
- 查看已结束的中国大学MOOC课程
- RTMP视频推流功能组件EasyRTMP-HIK DEMO版本运行报错0xc000007b问题排查分析
- 【QTdesigner】课时52.绘制各种图形(paintEevnt()))【pyqt5+QTdesigner模式】
- PDF翻译,仅支持英译中,可以下载翻译后的pdf或者word版
- 程序员的价值观——经验是无价之宝(转)
- oracle_SQL实验一