程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java線程池應用,java線程池

Java線程池應用,java線程池

編輯:JAVA綜合教程

Java線程池應用,java線程池


Executors工具類用於創建Java線程池和定時器。

newFixedThreadPool:創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。如果在所有線程處於活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那麼一個新線程將代替它執行後續的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。

創建一個固定大小的線程池來執行10個任務: 

實例:

 1 ExecutorService threadPool = Executors.newFixedThreadPool(3);
 2         for (int j = 0; j < 10; j++) {
 3             final int task = j;
 4             threadPool.execute(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     for (int i = 0; i < 10; i++) {
 8                         try {
 9                             Thread.sleep(200);
10                         } catch (InterruptedException e) {
11                             // TODO Auto-generated catch block
12                             e.printStackTrace();
13                         }
14                         System.out.println(Thread.currentThread().getName()+"is looping of "+ i +" task of "+task);
15                     }
16                     
17                 }
18             });
19         }

newCachedThreadPool 創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對於執行很多短期異步任務的程序而言,這些線程池通常可提高程序性能。調用 execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持空閒的線程池不會使用任何資源。注意,可以使用 ThreadPoolExecutor 構造方法創建具有類似屬性但細節不同(例如超時參數)的線程池。 

創建10個線程的緩存池執行10個任務

實例:

 1 ExecutorService threadPool = Executors.newCachedThreadPool();
 2         for (int j = 0; j < 10; j++) {
 3             final int task = j;
 4             threadPool.execute(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     for (int i = 0; i < 10; i++) {
 8                         try {
 9                             Thread.sleep(200);
10                         } catch (InterruptedException e) {
11                             // TODO Auto-generated catch block
12                             e.printStackTrace();
13                         }
14                         System.out.println(Thread.currentThread().getName()+"is looping of "+ i +" task of "+task);
15                     }
16                     
17                 }
18             });
19         }

newSingleThreadExecutor 創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。

創建一個線程執行十個任務(可以用於讓一個死去線程復活重新執行,實際是啟動一個新的線程)

實例:

 1 ExecutorService threadPool = Executors.newSingleThreadExecutor();
 2         for (int j = 0; j < 10; j++) {
 3             final int task = j;
 4             threadPool.execute(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     for (int i = 0; i < 10; i++) {
 8                         try {
 9                             Thread.sleep(200);
10                         } catch (InterruptedException e) {
11                             // TODO Auto-generated catch block
12                             e.printStackTrace();
13                         }
14                         System.out.println(Thread.currentThread().getName()+"is looping of "+ i +" task of "+task);
15                     }
16                     
17                 }
18             });
19         }

shutdown和shutdownNow的區別

shutdown:啟動一次順序關閉,執行以前提交的任務,但不接受新任務。如果已經關閉,則調用沒有其他作用。

shutdownNow:試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並返回等待執行的任務列表。無法保證能夠停止正在處理的活動執行任務,但是會盡力嘗試。例如,通過 Thread.interrupt() 來取消典型的實現,所以任何任務無法響應中斷都可能永遠無法終止。  

ScheduledExecutorService線程池定時器。schedule 方法使用各種延遲創建任務,並返回一個可用於取消或檢查執行的任務對象。scheduleAtFixedRate 和scheduleWithFixedDelay 方法創建並執行某些在取消前一直定期運行的任務。

schedule 創建並執行在給定延遲後啟用的一次性操作。

 1 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
 2         for (int i = 0; i < 10; i++) {
 3             final int timer = i;*/
 4             /*scheduledThreadPool.schedule(new Runnable() {
 5                 @Override
 6                 public void run() {
 7                     try {
 8                         Thread.sleep(20);
 9                     } catch (InterruptedException e) {
10                         // TODO Auto-generated catch block
11                         e.printStackTrace();
12                     }
13                     System.out.println(Thread.currentThread().getName()+" " +timer);
14                 }
15             }, 2, TimeUnit.SECONDS);

scheduleAtFixedRate 創建並執行一個在給定初始延遲後首次啟用的定期操作,後續操作具有給定的周期;也就是將在 initialDelay 後開始執行,然後在 initialDelay+period 後執行,接著在 initialDelay + 2 * period 後執行,依此類推。如果任務的任何一個執行遇到異常,則後續執行都會被取消。否則,只能通過執行程序的取消或終止方法來終止該任務。如果此任務的任何一個執行要花費比其周期更長的時間,則將推遲後續執行,但不會同時執行。  

 1 scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 2                 
 3                 @Override
 4                 public void run() {
 5                     try {
 6                         Thread.sleep(20);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                     System.out.println(Thread.currentThread().getName());
12                 }
13             }, 2, 3, TimeUnit.SECONDS);

scheduleWithFixedDelay 創建並執行一個在給定初始延遲後首次啟用的定期操作,隨後,在每一次執行終止和下一次執行開始之間都存在給定的延遲。如果任務的任一執行遇到異常,就會取消後續執行。否則,只能通過執行程序的取消或終止方法來終止該任務。

 1 scheduledThreadPool.scheduleWithFixedDelay(new Runnable() {
 2                 
 3                 @Override
 4                 public void run() {
 5                     try {
 6                         Thread.sleep(20);
 7                     } catch (InterruptedException e) {
 8                         // TODO Auto-generated catch block
 9                         e.printStackTrace();
10                     }
11                     System.out.println(Thread.currentThread().getName());
12                 }
13             }, 2, 3, TimeUnit.SECONDS);

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved