posts - 38, comments - 2, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          (轉)隊列和線程池簡單示例

          Posted on 2009-08-03 18:18 AntiquMan 閱讀(204) 評論(0)  編輯  收藏 所屬分類: Thread

          基本演示了線程池和隊列的應用

            public class WorkQueue { 
             

             private final int nThreads;//線程池的大小 
             private final PoolWorker[] threads;//用數組實現線程池 
             private final LinkedList queue;//任務隊列 

            public WorkQueue(int nThreads){ 
               this.nThreads = nThreads; 
               queue = new LinkedList(); 
               threads = new PoolWorker[nThreads]; 

                for (int i=0; i<nThreads;i++){

                   threads[i] = new PoolWorker(); 
                   threads[i].start();//啟動所有工作線程 
                } 
            } 

            public void execute(Runnable r) {//
          任務 
              synchronized(queue) { 
                      queue.addLast(r); 
                      queue.notify(); 
              } 
            } 

            private class PoolWorker extends Thread {//工作線程類 
                  public void run() { 
                         Runnable r; 
                         while (true) { 
                              synchronized(queue) { 
                                while (queue.isEmpty()) {//如果任務隊列中沒有任務,等待 
                                  try{ 
                                    queue.wait(); 
                                  }catch (InterruptedException ignored){} 
                                }    
                                 r = (Runnable) queue.removeFirst();//有任務時,取出任務 
                             } 
                             try { 
                                 r.run();//執行任務 
                             }catch (RuntimeException e) { 
                                // You might want to log something here 
                            } 
                        } 
                } 
             } 


           public static void main(String args[]){ 
                WorkQueue wq=new WorkQueue(10);//10個工作線程 
                Mytask r[]=new Mytask[20];//20個任務 
             
                for(int i=0;i<20;i++){ 
                     r[i]=new Mytask(); 
                     wq.execute(r[i]); 
                }       
           } 

          class Mytask implements Runnable{//任務接口 
                   public void run(){ 
                        String name=Thread.currentThread().getName(); 
                        try{ 
                            Thread.sleep(100);//模擬任務執行的時間 
                        }catch(InterruptedException e){} 
                        System.out.println(name+" executed OK"); 
                   } 
            } 


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 东乡| 锡林浩特市| 黄平县| 曲周县| 巨鹿县| 安顺市| 当阳市| 澎湖县| 南投县| 红安县| 新营市| 阳泉市| 鄱阳县| 洛扎县| 灵丘县| 柳河县| 鹤壁市| 屏山县| 桑日县| 河源市| 萍乡市| 崇仁县| 安义县| 舒兰市| 女性| 咸阳市| 合川市| 卫辉市| 陈巴尔虎旗| 台南市| 大竹县| 浙江省| 江津市| 康平县| 怀集县| 平塘县| 吉林市| 团风县| 浪卡子县| 满洲里市| 桃江县|