线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

  在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相关推荐

  1. 线程池Executors.newFixedThreadPool验证以及总结

    1.Executors在于java.util.comcurrent.包下,Executors.newFixedThreadPool(n)创建容器大小为n的线程池,表示正在执行中的线程只有n个, 实践代 ...

  2. 线程池Executors.newFixedThreadPool

    转载至::. https://blog.csdn.net/bobo8945510/article/details/52135076 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池 ...

  3. Java自带的线程池ThreadPoolExecutor详细介绍说明和实例运用

    Java 5 开始,Java 提供了自己的线程池.线程池就是一个线程的容器,每次只执行额定数量的线程. java.util.concurrent.ThreadPoolExecutor 就是这样的线程池 ...

  4. 深入理解Java自带的线程池和缓冲队列

    https://www.cnblogs.com/xiguadadage/p/10243332.html

  5. java executors 详解_线程池—Executors 详解

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 线 ...

  6. 【Java 并发编程】线程池机制 ( 线程池示例 | newCachedThreadPool | newFixedThreadPool | newSingleThreadExecutor )

    文章目录 前言 一.线程池示例 二.newCachedThreadPool 线程池示例 三.newFixedThreadPool 线程池示例 三.newSingleThreadExecutor 线程池 ...

  7. Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool

    Java线程池newSingleThreadExecutor newFixedThreadPool newCachedThreadPool newScheduledThreadPool 一.线程池的理 ...

  8. java高级应用:线程池全面解析

    什么是线程池? 很简单,简单看名字就知道是装有线程的池子,我们可以把要执行的多线程交给线程池来处理,和连接池的概念一样,通过维护一定数量的线程池来达到多个线程的复用. 线程池的好处 我们知道不用线程池 ...

  9. 【Java 并发编程】线程池机制 ( ThreadPoolExecutor 线程池构造参数分析 | 核心线程数 | 最大线程数 | 非核心线程存活时间 | 任务阻塞队列 )

    文章目录 前言 一.ThreadPoolExecutor 构造参数 二.newCachedThreadPool 参数分析 三.newFixedThreadPool 参数分析 四.newSingleTh ...

最新文章

  1. Android 通用流行框架大全
  2. 【JDK源码】java.io包常用类详解
  3. telnet后为啥打开的时防火墙_以前用散煤取暖时,农民很大方,换上天然气后就“蔫了”,为啥?...
  4. Apache配置SSL证书指引
  5. 重新开始我的blog内容!
  6. 3D视觉(二)四元数简要说明
  7. CSF 格式文件播放器 下载地址
  8. 各大搜索引擎站点提交入口大全
  9. 《NAT穿越(NAT-T)RFC3947文档》记录
  10. 【软硬件基础】X86和X64
  11. 游戏党福音,Google play游戏明年登录Windows
  12. android 手电筒开发
  13. 整除/ 与 求余% 运算
  14. 转帖【编码原则十日谈】
  15. 查看已结束的中国大学MOOC课程
  16. RTMP视频推流功能组件EasyRTMP-HIK DEMO版本运行报错0xc000007b问题排查分析
  17. 【QTdesigner】课时52.绘制各种图形(paintEevnt()))【pyqt5+QTdesigner模式】
  18. PDF翻译,仅支持英译中,可以下载翻译后的pdf或者word版
  19. 程序员的价值观——经验是无价之宝(转)
  20. oracle_SQL实验一

热门文章

  1. 进程与线程 thread (二)——线程概念
  2. 【超简单】MySQL存储引擎的选择与配置
  3. Redis和Memcached的一些区别
  4. python程序默认执行与多线程
  5. 将你的 CentOS 变成 OSPF 路由器
  6. Python:SQLMap源码精读—基于错误的盲注(error-based blind)
  7. 【Cocos2dx开发】精灵
  8. linux shell mv/cp 错误: will not overwrite just-created <filename> with <sameFilename> 解决方法
  9. linux sort 排序命令简介
  10. golang 正则使用总结