java 建立线程池(转)

线程池的做用:javascript

     线程池做用就是限制系统中执行线程的数量。
     根据系统的环境状况,能够自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了形成系统拥挤效率不高。用线程池控制线程数量,其余线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务须要运行时,若是线程池中有等待的工做线程,就能够开始运行了;不然进入等待队列。
java

 

为何要用线程池:web

  1. 减小了建立和销毁线程的次数,每一个工做线程均可以被重复利用,可执行多个任务
  2. 能够根据系统的承受能力,调整线程池中工做线线程的数目,防止由于由于消耗过多的内存,而把服务器累趴下(每一个线程须要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)

线程池类服务器

    

Java代码     收藏代码
  1. package com.tdt.impl.ls;  
  2.   
  3. import java.util.LinkedList;  
  4.   
  5. /** 
  6.  * @project LocationGateway 
  7.  * @author sunnylocus    
  8.  * @verson 1.0.0 
  9.  * @date   Aug 2, 2008 
  10.  * @jdk    1.4.2 
  11.  */  
  12. public class ThreadPool extends ThreadGroup {  
  13.     private boolean isClosed = false;  //线程池是否关闭   
  14.     private LinkedList workQueue;      //工做队列  
  15.     private static int threadPoolID = 1;  //线程池的id  
  16.     public ThreadPool(int poolSize) {  //poolSize 表示线程池中的工做线程的数量  
  17.   
  18.         super(threadPoolID + "");      //指定ThreadGroup的名称  
  19.         setDaemon(true);               //继承到的方法,设置是否守护线程池  
  20.         workQueue = new LinkedList();  //建立工做队列  
  21.         for(int i = 0; i < poolSize; i++) {  
  22.             new WorkThread(i).start();   //建立并启动工做线程,线程池数量是多少就建立多少个工做线程  
  23.         }  
  24.     }  
  25.       
  26.     /** 向工做队列中加入一个新任务,由工做线程去执行该任务*/  
  27.     public synchronized void execute(Runnable task) {  
  28.         if(isClosed) {  
  29.             throw new IllegalStateException();  
  30.         }  
  31.         if(task != null) {  
  32.             workQueue.add(task);//向队列中加入一个任务  
  33.             notify();           //唤醒一个正在getTask()方法中待任务的工做线程  
  34.         }  
  35.     }  
  36.       
  37.     /** 从工做队列中取出一个任务,工做线程会调用此方法*/  
  38.     private synchronized Runnable getTask(int threadid) throws InterruptedException {  
  39.         while(workQueue.size() == 0) {  
  40.             if(isClosed) return null;  
  41.             System.out.println("工做线程"+threadid+"等待任务...");  
  42.             wait();             //若是工做队列中没有任务,就等待任务  
  43.         }  
  44.         System.out.println("工做线程"+threadid+"开始执行任务...");  
  45.         return (Runnable) workQueue.removeFirst(); //反回队列中第一个元素,并从队列中删除  
  46.     }  
  47.       
  48.     /** 关闭线程池 */  
  49.     public synchronized void closePool() {  
  50.         if(! isClosed) {  
  51.             waitFinish();        //等待工做线程执行完毕  
  52.             isClosed = true;  
  53.             workQueue.clear();  //清空工做队列  
  54.             interrupt();        //中断线程池中的全部的工做线程,此方法继承自ThreadGroup类  
  55.         }  
  56.     }  
  57.       
  58.     /** 等待工做线程把全部任务执行完毕*/  
  59.     public void waitFinish() {  
  60.         synchronized (this) {  
  61.             isClosed = true;  
  62.             notifyAll();            //唤醒全部还在getTask()方法中等待任务的工做线程  
  63.         }  
  64.         Thread[] threads = new Thread[activeCount()]; //activeCount() 返回该线程组中活动线程的估计值。  
  65.         int count = enumerate(threads); //enumerate()方法继承自ThreadGroup类,根据活动线程的估计值得到线程组中当前全部活动的工做线程  
  66.         for(int i =0; i < count; i++) { //等待全部工做线程结束  
  67.             try {  
  68.                 threads[i].join();  //等待工做线程结束  
  69.             }catch(InterruptedException ex) {  
  70.                 ex.printStackTrace();  
  71.             }  
  72.         }  
  73.     }  
  74.   
  75.     /** 
  76.      * 内部类,工做线程,负责从工做队列中取出任务,并执行 
  77.      * @author sunnylocus 
  78.      */  
  79.     private class WorkThread extends Thread {  
  80.         private int id;  
  81.         public WorkThread(int id) {  
  82.             //父类构造方法,将线程加入到当前ThreadPool线程组中  
  83.             super(ThreadPool.this,id+"");  
  84.             this.id =id;  
  85.         }  
  86.         public void run() {  
  87.             while(! isInterrupted()) {  //isInterrupted()方法继承自Thread类,判断线程是否被中断  
  88.                 Runnable task = null;  
  89.                 try {  
  90.                     task = getTask(id);     //取出任务  
  91.                 }catch(InterruptedException ex) {  
  92.                     ex.printStackTrace();  
  93.                 }  
  94.                 //若是getTask()返回null或者线程执行getTask()时被中断,则结束此线程  
  95.                 if(task == nullreturn;  
  96.                   
  97.                 try {  
  98.                     task.run();  //运行任务  
  99.                 }catch(Throwable t) {  
  100.                     t.printStackTrace();  
  101.                 }  
  102.             }//  end while  
  103.         }//  end run  
  104.     }// end workThread  
  105. }  

 

2.测试类app

  

Java代码     收藏代码
  1. package com.tdt.test;  
  2.   
  3. import com.tdt.impl.ls.ThreadPool;  
  4.   
  5. public class ThreadPoolTest {  
  6.       
  7.     public static void main(String[] args) throws InterruptedException {  
  8.         ThreadPool threadPool = new ThreadPool(3); //建立一个有个3工做线程的线程池  
  9.         Thread.sleep(500); //休眠500毫秒,以便让线程池中的工做线程所有运行  
  10.         //运行任务  
  11.         for (int i = 0; i <=5 ; i++) { //建立6个任务  
  12.             threadPool.execute(createTask(i));  
  13.         }  
  14.         threadPool.waitFinish(); //等待全部任务执行完毕  
  15.         threadPool.closePool(); //关闭线程池  
  16.   
  17.     }  
  18.   
  19.     private static Runnable createTask(final int taskID) {  
  20.         return new Runnable() {  
  21.             public void run() {  
  22.             //  System.out.println("Task" + taskID + "开始");  
  23.                 System.out.println("Hello world");  
  24.             //  System.out.println("Task" + taskID + "结束");  
  25.             }  
  26.         };  
  27.     }  
  28. }  

 

 

结果:测试

Java代码     收藏代码
  1. 工做线程0等待任务...  
  2. 工做线程1等待任务...  
  3. 工做线程2等待任务...  
  4.   
  5. 工做线程0开始执行任务...  
  6. Hello world  
  7. 工做线程0等待任务...  
  8.   
  9. 工做线程1开始执行任务...  
  10. Hello world  
  11. 工做线程1等待任务...  
  12.   
  13. 工做线程2开始执行任务...  
  14. Hello world  
  15. 工做线程2等待任务...  
  16.   
  17. 工做线程0开始执行任务...  
  18. Hello world  
  19. 工做线程0等待任务...  
  20.   
  21. 工做线程1开始执行任务...  
  22. Hello world  
  23. 工做线程1等待任务...  
  24.   
  25. 工做线程2开始执行任务...  
  26. Hello world  
  27. 工做线程2等待任务...  

此上适用于jdk1.4版本。转自 http://sunnylocus.iteye.com/blog/223327#commentsthis

相关文章
相关标签/搜索