线程池的作用:

一个线程的周期分为:创建、运行、销毁三个阶段。

处理一个任务时,首先创建一个任务线程,然后执行任务,完了还要销毁线程。而线程只有处于运行状态的时候,才是真的在处理我们交给它的任务,这个阶段才是有效运行时间

所以,我们希望花在创建和销毁线程的资源越少越好。如果不销毁线程,而这个线程又不能被其他的任务调用,那么就会出现资源的浪费。为了提高效率,减少创建和销毁线程带来时间和空间上的浪费,出现了线程池技术。这种技术是在开始就创建一定量的线程,批量处理一类任务,等待任务的到来。任务执行完毕后,线程又可以执行其他的任务。等不再需要线程的时候,就销毁。这样就省去了频繁创建和销毁线程的麻烦。

1. 线程池类

  1. import java.util.LinkedList;
  2. import java.util.List;
  3.  
  4. public class MyThreadPool {
  5. // 线程池中默认线程的个数为5个
  6. private static int worker_num = 5;
  7. // 工作的线程
  8. private WorkThread[] workThreads;
  9. // 未处理的任务
  10. private static volatile int finished_task = 0;
  11. // 任务队列,作为一个缓冲,List线程不安全所以需要在使用的过程中对它进行同步。
  12. private List<Runnable> taskQueue = new LinkedList<Runnable>();
  13.  
  14. // 单例模式
  15. private static MyThreadPool threadPool;
  16. // 私有化构造方法
  17. private MyThreadPool(){
  18. this(5);
  19. }
  20. // 创建线程池,num为线程池工作线程的个数
  21. private MyThreadPool(int num) {
  22. MyThreadPool.worker_num = num;
  23. workThreads = new WorkThread[num];
  24. for (int i = 0; i < num; i++) {
  25. workThreads[i] = new WorkThread();
  26. workThreads[i].start();
  27. }
  28. }
  29.  
  30. // 获得一个线程池,默认线程数
  31. public static MyThreadPool getThreadPool(){
  32. return getThreadPool(MyThreadPool.worker_num);
  33. }
  34. // 单例模式,获得一个线程池
  35. public static MyThreadPool getThreadPool(int num) {
  36. if(num <= 0){
  37. num = MyThreadPool.worker_num;
  38. }
  39. if(threadPool == null){
  40. synchronized(MyThreadPool.class){
  41. if(threadPool == null)
  42. threadPool = new MyThreadPool(num);
  43. }
  44. }
  45. return threadPool;
  46. }
  47.  
  48. /**
  49. * 执行任务
  50. * 将该任务加入到任务队列的末尾,等待工作线程的调度
  51. * @param task
  52. */
  53. public void execute(Runnable task){
  54. synchronized (taskQueue){
  55. taskQueue.add(task);
  56. taskQueue.notify();
  57. }
  58. }
  59.  
  60. /**
  61. * 批量执行任务
  62. * 将任务放到任务队列的末尾,等待工作线程的调度
  63. * @param task
  64. */
  65. public void execute(Runnable[] task){
  66. synchronized (taskQueue){
  67. for (Runnable runnable : task) {
  68. taskQueue.add(runnable);
  69. }
  70. taskQueue.notify();
  71. }
  72. }
  73.  
  74. /**
  75. * 批量执行任务
  76. * 将任务放到任务队列的末尾,等待工作线程的调度
  77. * @param task
  78. */
  79. public void execute(List<Runnable> task){
  80. synchronized (taskQueue){
  81. for (Runnable runnable : task) {
  82. taskQueue.add(runnable);
  83. }
  84. taskQueue.notify();
  85. }
  86. }
  87.  
  88. /**
  89. * 销毁线程池
  90. * 在所有任务都完成的情况下才销毁所有线程,否则等待任务队列的任务全部完成才销毁
  91. */
  92. public void destroy(){
  93. while(!taskQueue.isEmpty()){// 如果还有任务没执行完成,就等会再看看
  94. try {
  95. Thread.sleep(10);
  96. } catch (InterruptedException e) {
  97. e.printStackTrace();
  98. }
  99. }
  100.  
  101. // 工作线程停止工作,且置为null
  102. for (int i = 0; i < MyThreadPool.worker_num; i++) {
  103. workThreads[i].stopWorker();
  104. workThreads[i] = null;
  105. }
  106. threadPool = null;
  107. taskQueue.clear();
  108. }
  109.  
  110. // 返回工作线程的个数
  111. public int getWorkThreadNumber() {
  112. return worker_num;
  113. }
  114.  
  115. // 返回已完成任务的个数
  116. public int getFinishedTaskNumber(){
  117. return finished_task;
  118. }
  119.  
  120. // 返回任务队列的长度,即还没处理的任务个数
  121. public int getWaitTaskNumber(){
  122. return taskQueue.size();
  123. }
  124.  
  125. // 覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数
  126. @Override
  127. public String toString() {
  128. return "WorkThread number:" + worker_num + " finished task number:"
  129. + finished_task + " wait task number:" + getWaitTaskNumber();
  130. }
  131.  
  132. /**
  133. * 内部类,工作线程用来执行任务线程
  134. * @author liu
  135. *
  136. */
  137. private class WorkThread extends Thread{
  138. // 该工作线程是否有效,用于自然结束该工作线程
  139. private boolean isRunning = true;
  140.  
  141. /*
  142. * 工作线程的关键之处,如果任务队列不空,则取出任务执行,若任务队列空,则等待。直到任务队列有任务时才取出执行
  143. */
  144. @Override
  145. public void run() {
  146. Runnable r = null;
  147. while( isRunning ){// 队列为空
  148. synchronized (taskQueue){
  149. while(isRunning && taskQueue.isEmpty()){
  150. try {
  151. taskQueue.wait(20);
  152. } catch (InterruptedException e) {
  153. e.printStackTrace();
  154. }
  155. }
  156.  
  157. if(!taskQueue.isEmpty()){
  158. // 取出任务
  159. r = taskQueue.remove(0);
  160. }
  161. }
  162.  
  163. if(r != null){
  164. r.run();
  165. // 完成的任务加一
  166. finished_task += 1;
  167. }
  168.  
  169. r = null;
  170. }
  171. }
  172.  
  173. // 停止工作,让该线程自然执行完run方法,自然结束
  174. public void stopWorker() {
  175. this.isRunning = false;
  176. }
  177.  
  178. }
  179. }

2. 测试代码

  1. public class TestThreadPool {
  2.  
  3. public static void main(String[] args) {
  4. // 创建5个线程的线程池
  5. MyThreadPool t = MyThreadPool.getThreadPool(5);
  6. Runnable[] r = new Runnable[] { new Task(), new Task(), new Task()};
  7. t.execute(r);
  8. r = new Runnable[] {new Task(), new Task(), new Task()};
  9. t.execute(r);
  10. System.out.println(t);
  11. t.destroy();// 所有线程都执行完成才destory
  12. System.out.println(t);
  13. }
  14.  
  15. // 任务类
  16. static class Task implements Runnable {
  17. private static volatile int i = 1;
  18.  
  19. @Override
  20. public void run() {// 执行任务
  21. System.out.println("任务 " + (i++) + " 完成");
  22. }
  23. }
  24. }

3. 运行结果

aaarticlea/png;base64,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" alt="" />

注:参照网上的代码和思路,通过自己的修改和调试完成

Java线程池的实现的更多相关文章

  1. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  2. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

  3. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  4. Java线程池的那些事

    熟悉java多线程的朋友一定十分了解java的线程池,jdk中的核心实现类为java.util.concurrent.ThreadPoolExecutor.大家可能了解到它的原理,甚至看过它的源码:但 ...

  5. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  6. Java线程池的几种实现 及 常见问题讲解

    工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能 ...

  7. Java线程池应用

    Executors工具类用于创建Java线程池和定时器. newFixedThreadPool:创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程.在任意点,在大多数 nThread ...

  8. Java线程池的原理及几类线程池的介绍

    刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...

  9. Java线程池与java.util.concurrent

    Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...

  10. [转 ]-- Java线程池使用说明

    Java线程池使用说明 原文地址:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1. ...

随机推荐

  1. 实用手册:130+ 提高开发效率的 vim 常用命令

    Vim 是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器.这里收录了130+程 ...

  2. SQL Server 2016里TempDb的提升

    几个星期前,SQL Server 2016的最新CTP版本已经发布了:CTP 2.4(目前已经是CTP 3.0).这个预览版相比以前的CTP包含了很多不同的提升.在这篇文章里我会谈下对于SQL Ser ...

  3. ASP.NET MVC分页实现之改进版-增加同一个视图可设置多个分页

    我之前就已经实现了ASP.NET MVC分页(查看该博文),但它有局限性,必须确保在同一个视图中只能有一处分页,若需要在同一个视图中设置多个分页,却无能为力,为此,我重新对原先的代码进行了优化,增加了 ...

  4. JS魔法堂:关于元素位置和鼠标位置的属性

    一.关于鼠标位置的属性   1. 触发鼠标事件的区域 盒子模型中的border,padding,content区域会触发鼠标事件,点击margin区域将不触发鼠标事件.   2. 鼠标事件对象Mous ...

  5. Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室

    一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ...

  6. 迭代接口的IEnumerator

    我们经常在工作中用到对List,Dictionary对象的Foreach遍历,取出每一项. 其实这个接口很简单,只有一个属性2个方法. [ComVisible(true), Guid("49 ...

  7. ASP.NET MVC使用动态产生meta

    在ASP.NET中,我们是很容易动态为header节点添加meta信息.<动态修改网页Header属性,Title,Meta标签等>http://www.cnblogs.com/insus ...

  8. Winform开发框架之客户关系管理系统(CRM)的报价单和销售单的处理

    在前面介绍了很多CRM相关的界面和实现思路的随笔文章,本篇继续介绍一下系统中用到的一些经验和技巧片段.本篇随笔主要介绍客户关系管理系统(CRM)的报价单和销售单的处理界面效果,使用列表内置的选择代替弹 ...

  9. (转载)IO-同步、异步、阻塞、非阻塞

    一.概述 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不 ...

  10. 【Unity】13.2 通过Lighting Window设置相关参数

    分类:Unity.C#.VS2015 创建日期:2016-05-19 一.简介 Unity 5.3.4的Lighting Window有3个选项卡:Object.Scene.Lightmaps. 二. ...