线程池

  1. package org.jr.util;

  2. *
  3. */
  4. import java.util.Vector;

  5. /**
  6. *线程池的方法使得在线程密集的情况下原有线程得到重用
  7. *从而提高性能
  8. *@since 0.6
  9. */
  10. public class ThreadPool implements Runnable{

  11.   //ThreadPool里最大线程数、最少线程数、释放延时的确省值
  12.   public final static int DEFAULT_MIN_SIZE = 0;
  13.   public final static int DEFAULT_MAX_SIZE = Integer.MAX_VALUE;
  14.   public final static long DEFAULT_RELEASE_DELAY = 10 * 1000;
  15.   //用户定制的threadpool属性值
  16.   protected int minSize;
  17.   protected int maxSize;
  18.   protected long releaseDelay;
  19.   //ThreadPool里现有的线程数
  20.   protected int currentSize;
  21.   //ThradPool里还可以提供的线程数
  22.   protected int availableThreads;
  23.   //任务列表(实质意义上的线程池)
  24.   protected Vector taskList;

  25.   /**
  26.    *用户定制的ThradPool
  27.    *@param minSize 线程池最少线程数
  28.    *@param maxSize 线程池最多线程数
  29.    *@param releaseDelay 线程释放延时
  30.    */
  31.   public ThreadPool(int minSize,int maxSize,long releaseDelay) {
  32.     this.minSize = minSize;
  33.     this.maxSize = maxSize;
  34.     this.releaseDelay = releaseDelay;
  35.     taskList = new Vector(100);
  36.     availableThreads = 0;
  37.   }
  38.   /**
  39.    *缺省的ThreadPool
  40.    */
  41.   public ThreadPool(){
  42.     this(DEFAULT_MIN_SIZE,DEFAULT_MIN_SIZE,DEFAULT_RELEASE_DELAY);
  43.   }
  44.   /**
  45.    *设置线程池中最少线程数
  46.    *@param minSize 线程池最少线程数
  47.    */
  48.   public synchronized void setMinSize(int minSize){
  49.     this.minSize = minSize;
  50.   }
  51.   /**
  52.    *读取线程池最少线程数这一属性
  53.    */
  54.   public synchronized int getMinSize(){
  55.     return minSize;
  56.   }
  57.   /**
  58.    *设置线程池中最大线程数
  59.    *@param maxSize 线程池最大线程数
  60.    */
  61.   public synchronized void setMaxSize(int maxSize){
  62.     this.maxSize = maxSize;
  63.   }
  64.   /**
  65.    *读取线程池最大线程数这一属性
  66.    */
  67.   public synchronized int getMaxSize(){
  68.     return maxSize;
  69.   }
  70.   /**
  71.    *设置线程池中线程释放延时
  72.    *@param releaseDelay 线程释放延时
  73.    */
  74.   public synchronized void setReleaseDelay(long releaseDelay){
  75.     this.releaseDelay = releaseDelay;
  76.   }
  77.   /**
  78.    *读取线程释放延时这一属性
  79.    */
  80.   public synchronized long getReleaseDelay(){
  81.     return releaseDelay;
  82.   }
  83.   /**
  84.    *往ThreadPool里添加新的任务
  85.    *@param runnable 新的任务
  86.    */
  87.   public synchronized void addTask(Runnable runnable){

  88.     taskList.addElement(runnable);
  89.     if(availableThreads > 0){
  90.        this.notify();
  91.     }
  92.     else{
  93.       if(currentSize < maxSize){
  94.         Thread t = new Thread(this);
  95.         currentSize++;
  96.         t.start();
  97.       }
  98.     }
  99.   }

  100.   public void run(){
  101.     Runnable task;
  102.     while(true){
  103.       synchronized(this){
  104.         if(currentSize > maxSize){
  105.           currentSize--;
  106.           break;
  107.         }
  108.         task = getNextTask();
  109.         if(task == null ){
  110.           try{
  111.             availableThreads++;
  112.             wait(releaseDelay);
  113.             availableThreads--;
  114.           }catch(InterruptedException ie){
  115.             // do something you wanna
  116.           }
  117.           task = getNextTask();
  118.           if(task == null){
  119.             if(currentSize < minSize)
  120.               continue;
  121.             currentSize--;
  122.             break;
  123.           }
  124.         }
  125.       }
  126.       try{
  127.         task.run();
  128.       }catch(Exception e){
  129.         System.err.println("Uncaught exception");
  130.         e.printStackTrace(System.err);
  131.       }
  132.     }
  133.   }
  134.   /**
  135.    *从任务列表中获取下一个任务
  136.    *
  137.    */
  138.   protected synchronized Runnable getNextTask(){
  139.     Runnable task = null;
  140.     if(taskList.size() > 0){
  141.       task = (Runnable)(taskList.elementAt(0));
  142.       taskList.removeElementAt(0);
  143.     }
  144.     return task;
  145.   }
  146.   /**
  147.    *返回ThreadPool的信息
  148.    */
  149.   public String toString(){
  150.     StringBuffer sb = new StringBuffer();
  151.     sb.append("DEFAULT_MIN_SIZE : " + DEFAULT_MIN_SIZE + "/n");
  152.     sb.append("DEFAULT_MAX_SIZE : " + DEFAULT_MAX_SIZE + "/n");
  153.     sb.append("DEFAULT_RELEASE_DELAY : " + DEFAULT_RELEASE_DELAY + "/n" );
  154.     sb.append("the information about your's construct ThreadPool below : /n");
  155.     sb.append("minSize /t maxSize /t releaseDelay /n");
  156.     sb.append(minSize + "/t" +  maxSize +"/t" + releaseDelay );

  157.     return sb.toString();
  158.   }

  159. }
  http://javaresearch.gro.clinux.org/source/org/jr/util/ThreadPool.java.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值