熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

JDK5 java.util.concurrent 線程池[1]

2013-11-23 19:57:10  來源: Java高級技術 

    最近JDK RC已經發布了而對於JDK的新特性還來不及使用雖然在項目中還沒有使用但可以寫一些Demo體驗一下Tiger的魅力現在的時代就是體驗的時代事事都要親歷親為才能有發言權怎麼有點毛主席實事求是的感覺

    JDK中的一個亮點就是將Doug Lea的並發庫引入到Java標准庫中Doug Lea確實是一個牛人能教書能出書能編碼不過這在國外還是比較普遍的而國內的教授們就相差太遠了

    一般的服務器都需要線程池比如WebFTP等服務器不過它們一般都自己實現了線程池比如以前介紹過的TomcatResin和Jetty等現在有了JDK我們就沒有必要重復造車輪了直接使用就可以何況使用也很方便性能也非常高

 packageconcurrent;
  importjavautilconcurrentExecutorService;
  importjavautilconcurrentExecutors;
  publicclassTestThreadPool{
  publicstaticvoidmain(Stringargs[])throwsInterruptedException{
  //onlytwothreads
  ExecutorServiceexec=ExecutorsnewFixedThreadPool();
  for(intindex=;index<;index++){
  Runnablerun=newRunnable(){
  publicvoidrun(){
  longtime=(long)(Mathrandom()*);
  Systemoutprintln(Sleeping+time+ms);
  try{
  Threadsleep(time);
  }catch(InterruptedExceptione){
  }
  }
  };
  execexecute(run);
  }
  //mustshutdown
  execshutdown();
  }
  }
  

    上面是一個簡單的例子使用了個大小的線程池來處理個線程但有一個問題在for循環的過程中會等待線程池有空閒的線程所以主線程會阻塞的為了解決這個問題一般啟動一個線程來做for循環就是為了避免由於線程池滿了造成主線程阻塞不過在這裡我沒有這樣處理[重要修正經過測試即使線程池大小小於實際線程數大小線程池也不會阻塞的這與Tomcat的線程池不同它將Runnable實例放到一個無限的BlockingQueue中所以就不用一個線程啟動for循環]

    另外它使用了Executors的靜態函數生成一個固定的線程池顧名思義線程池的線程是不會釋放的即使它是Idle這就會產生性能問題比如如果線程池的大小為當全部使用完畢後所有的線程會繼續留在池中相應的內存和線程切換(while(true)+sleep循環)都會增加如果要避免這個問題就必須直接使用ThreadPoolExecutor()來構造可以像Tomcat的線程池一樣設置最大線程數最小線程數空閒線程keepAlive的時間通過這些可以基本上替換Tomcat的線程池實現方案

[]  []  


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27713.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.