JAVA线程池实现

JAVA的线程池,准备写C#,拿来参考

  1. package org.jr.util;

  2. /**
  3. * <p>Copyright: Copyright (c) 2002-2003</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. }
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值