1. package org.jr.util;
  2. /**
  3. * <p>Copyright: Copyright (c) 2002-2004</p>
  4. * <p>Company: JavaResearch(http://www.javaresearch.org)</p>
  5. * <p>最后更新日期:2003年4月22日</p>
  6. * @author hijack
  7. */
  8. import java.util.Vector;
  9. /**
  10. *线程池的方法使得在线程密集的情况下原有线程得到重用
  11. *从而提高性能
  12. *@since 0.6
  13. */
  14. public class ThreadPool implements Runnable{
  15. //ThreadPool里最大线程数、最少线程数、释放延时的确省值
  16. public final static int DEFAULT_MIN_SIZE = 0;
  17. public final static int DEFAULT_MAX_SIZE = Integer.MAX_VALUE;
  18. public final static long DEFAULT_RELEASE_DELAY = 10 * 1000;
  19. //用户定制的threadpool属性值
  20. protected int minSize;
  21. protected int maxSize;
  22. protected long releaseDelay;
  23. //ThreadPool里现有的线程数
  24. protected int currentSize;
  25. //ThradPool里还可以提供的线程数
  26. protected int availableThreads;
  27. //任务列表(实质意义上的线程池)
  28. protected Vector taskList;
  29. /**
  30. *用户定制的ThradPool
  31. *@param minSize 线程池最少线程数
  32. *@param maxSize 线程池最多线程数
  33. *@param releaseDelay 线程释放延时
  34. */
  35. public ThreadPool(int minSize,int maxSize,long releaseDelay) {
  36. this.minSize = minSize;
  37. this.maxSize = maxSize;
  38. this.releaseDelay = releaseDelay;
  39. taskList = new Vector(100);
  40. availableThreads = 0;
  41. }
  42. /**
  43. *缺省的ThreadPool
  44. */
  45. public ThreadPool(){
  46. this(DEFAULT_MIN_SIZE,DEFAULT_MIN_SIZE,DEFAULT_RELEASE_DELAY);
  47. }
  48. /**
  49. *设置线程池中最少线程数
  50. *@param minSize 线程池最少线程数
  51. */
  52. public synchronized void setMinSize(int minSize){
  53. this.minSize = minSize;
  54. }
  55. /**
  56. *读取线程池最少线程数这一属性
  57. */
  58. public synchronized int getMinSize(){
  59. return minSize;
  60. }
  61. /**
  62. *设置线程池中最大线程数
  63. *@param maxSize 线程池最大线程数
  64. */
  65. public synchronized void setMaxSize(int maxSize){
  66. this.maxSize = maxSize;
  67. }
  68. /**
  69. *读取线程池最大线程数这一属性
  70. */
  71. public synchronized int getMaxSize(){
  72. return maxSize;
  73. }
  74. /**
  75. *设置线程池中线程释放延时
  76. *@param releaseDelay 线程释放延时
  77. */
  78. public synchronized void setReleaseDelay(long releaseDelay){
  79. this.releaseDelay = releaseDelay;
  80. }
  81. /**
  82. *读取线程释放延时这一属性
  83. */
  84. public synchronized long getReleaseDelay(){
  85. return releaseDelay;
  86. }
  87. /**
  88. *往ThreadPool里添加新的任务
  89. *@param runnable 新的任务
  90. */
  91. public synchronized void addTask(Runnable runnable){
  92. taskList.addElement(runnable);
  93. if(availableThreads > 0){
  94. this.notify();
  95. }
  96. else{
  97. if(currentSize < maxSize){
  98. Thread t = new Thread(this);
  99. currentSize++;
  100. t.start();
  101. }
  102. }
  103. }
  104. public void run(){
  105. Runnable task;
  106. while(true){
  107. synchronized(this){
  108. if(currentSize > maxSize){
  109. currentSize--;
  110. break;
  111. }
  112. task = getNextTask();
  113. if(task == null ){
  114. try{
  115. availableThreads++;
  116. wait(releaseDelay);
  117. availableThreads--;
  118. }catch(InterruptedException ie){
  119. // do something you wanna
  120. }
  121. task = getNextTask();
  122. if(task == null){
  123. if(currentSize < minSize)
  124. continue;
  125. currentSize--;
  126. break;
  127. }
  128. }
  129. }
  130. try{
  131. task.run();
  132. }catch(Exception e){
  133. System.err.println("Uncaught exception");
  134. e.printStackTrace(System.err);
  135. }
  136. }
  137. }
  138. /**
  139. *从任务列表中获取下一个任务
  140. *
  141. */
  142. protected synchronized Runnable getNextTask(){
  143. Runnable task = null;
  144. if(taskList.size() > 0){
  145. task = (Runnable)(taskList.elementAt(0));
  146. taskList.removeElementAt(0);
  147. }
  148. return task;
  149. }
  150. /**
  151. *返回ThreadPool的信息
  152. */
  153. public String toString(){
  154. StringBuffer sb = new StringBuffer();
  155. sb.append("DEFAULT_MIN_SIZE : " + DEFAULT_MIN_SIZE + "\n");
  156. sb.append("DEFAULT_MAX_SIZE : " + DEFAULT_MAX_SIZE + "\n");
  157. sb.append("DEFAULT_RELEASE_DELAY : " + DEFAULT_RELEASE_DELAY + "\n" );
  158. sb.append("the information about your's construct ThreadPool below : \n");
  159. sb.append("minSize \t maxSize \t releaseDelay \n");
  160. sb.append(minSize + "\t" + maxSize +"\t" + releaseDelay );
  161. return sb.toString();
  162. }
  163. }