多線程技術主要解決處理器單元內多個線程執行的問題,它能夠顯著減小處理器單元的閒置時間,增長處理器單元的吞吐能力。 java
線程池主要用來解決線程生命週期開銷問題和資源不足問題。經過對多個任務重用線程,線程建立的開銷就被分攤到了多個任務上了,並且因爲在請求到達時線程已經存在,因此消除了線程建立所帶來的延遲。這樣,就能夠當即爲請求服務,使應用程序響應更快。另外,經過適當地調整線程池中的線程數目能夠防止出現資源不足的狀況。
安全
JDK5中提供的Executors工具類能夠經過4個靜態方法建立4種線程池,以下所示:多線程
(1)Executors.newCachedThreadPool();ide
public static ExecutorService newCachedThreadPool(){ return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>()); }
public static ExecutorService newFixedThreadPool(int nThreads){ return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); }
它用來處理延時任務或定時任務。工具
它接收SchduledFutureTask類型的任務,有兩種提交任務的方式:spa
①scheduledAtFixedRate線程
②scheduledWithFixedDelay3d
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println("delay 3 seconds"); } }, 3, TimeUnit.SECONDS);
表示延遲3秒執行。 blog
scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println("delay 1 seconds, and excute every 3 seconds"); } }, 1, 3, TimeUnit.SECONDS);
表示延遲1秒後每3秒執行一次。 生命週期
ScheduledExecutorService比Timer更安全,功能更強大。
(4)Executors.newSingleThreadExecutor();
public static ExecutorService newSingleThreadExecutor(){ return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); }
建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index = i; singleThreadExecutor.execute(new Runnable() { @Override public void run() { try { System.out.println(index); Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); }
結果依次輸出,至關於順序執行各個任務。
現行大多數GUI程序都是單線程的。
線程池的做用:
減小了建立和銷燬線程的次數,每一個工做線程均可以被重複利用,可執行多個任務。根 據系統的環境狀況,能夠自動或手動設置線程數量,從而達到運行的最佳效果。