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"); 
                   } 
            } 


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


          網站導航:
           
          主站蜘蛛池模板: 柳州市| 张北县| 古浪县| 正安县| 道真| 磐安县| 松江区| 察隅县| 博野县| 封丘县| 万州区| 万源市| 绥宁县| 都江堰市| 普兰店市| 绥芬河市| 黑山县| 武隆县| 虞城县| 佛山市| 靖安县| 乾安县| 理塘县| 诸暨市| 昌平区| 江孜县| 寿宁县| 剑阁县| 和林格尔县| 庆阳市| 建平县| 全州县| 义乌市| 余庆县| 河津市| 马鞍山市| 洛阳市| 渭南市| 阿图什市| 河间市| 马公市|