package com.wangbiao.thread; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * @author wangbiao * @date and time Jun 18, 2014 3:16:12 PM * */ public class ThreadPoolStudy { public static void main(String[] args) { // create thread pool /* * Executors.newFixedThreadPool(3); * * 在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。 * 若是在全部線程處於活動狀態時提交附加任務,則在有可用線程以前,附加任務將在隊列中等待。 * 若是在關閉前的執行期間因爲失敗而致使任何線程終止,那麼一個新線程將代替它執行後續的任務(若是須要)。 * 在某個線程被顯式地關閉以前,池中的線程將一直存在。 */ // ExecutorService threadPool = Executors.newFixedThreadPool(3); /* * * Executors.newCachedThreadPool(); * * 建立一個可根據須要建立新線程的線程池,可是在之前構造的線程可用時將重用它們。 * 對於執行不少短時間異步任務的程序而言,這些線程池一般可提升程序性能。 調用 execute 將重用之前構造的線程(若是線程可用)。 * 若是現有線程沒有可用的,則建立一個新線程並添加到池中。 終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。 * 所以,長時間保持空閒的線程池不會使用任何資源。 注意,可使用 ThreadPoolExecutor * 構造方法建立具備相似屬性但細節不一樣(例如超時參數)的線程池。 */ // ExecutorService threadPool = Executors.newCachedThreadPool(); /* * Executors.newSingleThreadExecutor(); * * 建立一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。 * (注意,若是由於在關閉前的執行期間出現失敗而終止了此單個線程,那麼若是須要,一個新線程將代替它執行後續的任務)。 * 可保證順序地執行各個任務,而且在任意給定的時間不會有多個線程是活動的。 與其餘等效的 newFixedThreadPool(1) * 不一樣,可保證無需從新配置此方法所返回的執行程序便可使用其餘的線程 */ ExecutorService threadPool = Executors.newSingleThreadExecutor(); for (int i = 0; i <= 10; i++) {// excute 10 thread final int task = i; threadPool.execute(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for (int j = 0; j <= 10; j++) { System.out.println(Thread.currentThread().getName() + "-" + "is loop of " + j + "-" + "is thread " + task); } } }); } // threadPool.shutdownNow();//試圖中止全部正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。 threadPool.shutdown();// 啓動一次順序關閉,執行之前提交的任務,但不接受新任務。 // execute will be delay 10 seconds /* * Executors.newScheduledThreadPool(3).schedule(new Runnable() { * * @Override public void run() { // TODO Auto-generated method stub * System.out.println("begin to work"); } }, 10, TimeUnit.SECONDS); */ // execute will be delay 10 seconds, 2 seconds one execution Executors.newScheduledThreadPool(3).scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println("begin to work"); } }, 10, 2, TimeUnit.SECONDS); } }