麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

深入java線程池的使用詳解

2020-01-26 16:12:12
字體:
供稿:網(wǎng)友
在Java 5.0之前啟動一個任務(wù)是通過調(diào)用Thread類的start()方法來實現(xiàn)的,任務(wù)的提于交和執(zhí)行是同時進(jìn)行的,如果你想對任務(wù)的執(zhí)行進(jìn)行調(diào)度或是控制 同時執(zhí)行的線程數(shù)量就需要額外編寫代碼來完成。5.0里提供了一個新的任務(wù)執(zhí)行架構(gòu)使你可以輕松地調(diào)度和控制任務(wù)的執(zhí)行,并且可以建立一個類似數(shù)據(jù)庫連接 池的線程池來執(zhí)行任務(wù)。這個架構(gòu)主要有三個接口和其相應(yīng)的具體類組成。這三個接口是Executor, ExecutorService、ScheduledExecutorService,讓我們先用一個圖來顯示它們的關(guān)系:

圖的左側(cè)是接口,圖的右側(cè)是這些接口的具體類。注意Executor是沒有直接具體實現(xiàn)的。
Executor接口:是用來執(zhí)行Runnable任務(wù)的,它只定義一個方法:
•execute(Runnable command):執(zhí)行Ruannable類型的任務(wù)
ExecutorService接口:ExecutorService繼承了Executor的方法,并提供了執(zhí)行Callable任務(wù)和中止任務(wù)執(zhí)行的服務(wù),其定義的方法主要有:
•submit(task):可用來提交Callable或Runnable任務(wù),并返回代表此任務(wù)的Future對象
•invokeAll(collection of tasks):批處理任務(wù)集合,并返回一個代表這些任務(wù)的Future對象集合
•shutdown():在完成已提交的任務(wù)后關(guān)閉服務(wù),不再接受新任務(wù)
•shutdownNow():停止所有正在執(zhí)行的任務(wù)并關(guān)閉服務(wù)。
•isTerminated():測試是否所有任務(wù)都執(zhí)行完畢了。
•isShutdown():測試是否該ExecutorService已被關(guān)閉 
ScheduledExecutorService接口在ExecutorService的基礎(chǔ)上,ScheduledExecutorService提供了按時間安排執(zhí)行任務(wù)的功能,它提供的方法主要有:
•schedule(task, initDelay): 安排所提交的Callable或Runnable任務(wù)在initDelay指定的時間后執(zhí)行。
•scheduleAtFixedRate():安排所提交的Runnable任務(wù)按指定的間隔重復(fù)執(zhí)行
•scheduleWithFixedDelay():安排所提交的Runnable任務(wù)在每次執(zhí)行完后,等待delay所指定的時間后重復(fù)執(zhí)行。
 
重要的Executors類
雖然以上提到的接口有其實現(xiàn)的具體類,但為了方便Java 5.0建議使用Executors的工具類來得到Executor接口的具體對象,需要注意的是Executors是一個類,不是Executor的復(fù)數(shù) 形式。Executors提供了以下一些static的方法:
•callable(Runnable task):將Runnable的任務(wù)轉(zhuǎn)化成Callable的任務(wù)
•newSingleThreadExecutor:產(chǎn)生一個ExecutorService對象,這個對象只有一個線程可用來執(zhí)行任務(wù),若任務(wù)多于一個,任務(wù)將按先后順序執(zhí)行。
•newCachedThreadPool():產(chǎn)生一個ExecutorService對象,這個對象帶有一個線程池,線程池的大小會根據(jù)需要調(diào)整,線程執(zhí)行完任務(wù)后返回線程池,供執(zhí)行下一次任務(wù)使用。
•newFixedThreadPool(int poolSize):產(chǎn)生一個ExecutorService對象,這個對象帶有一個大小為poolSize的線程池,若任務(wù)數(shù)量大于poolSize,任務(wù)會被放在一個queue里順序執(zhí)行。
•newSingleThreadScheduledExecutor:產(chǎn)生一個ScheduledExecutorService對象,這個對象的線程池大小為1,若任務(wù)多于一個,任務(wù)將按先后順序執(zhí)行。
•newScheduledThreadPool(int poolSize):產(chǎn)生一個ScheduledExecutorService對象,這個對象的線程池大小為poolSize,若任務(wù)數(shù)量大于poolSize,任務(wù)會在一個queue里等待執(zhí)行

舉例說明:
應(yīng)用Executors來建立Thread pool
 
有時候您需要建立一堆Thread來執(zhí)行一些小任務(wù),然而頻繁的建立Thread有時會是個開銷,因為Thread的建立必須與作業(yè)系統(tǒng)互動,如果能建立一個Thread pool來管理這些小的Thread并加以重復(fù)使用,對于系統(tǒng)效能會是個改善的方式。
您可以使用Executors來建立Thread pool,Executors有幾個static方法,列出如下:

方法說明
newCachedThreadPool建立可以快取的Thread,每個Thread預(yù)設(shè)可idle 60秒

newFixedThreadPool

包括固定數(shù)量的Thread

newSingleThreadExecutor

只有一個Thread,循序的執(zhí)行指定給它的每個任務(wù)
newScheduledThreadPool可排程的Thread
newSingleThreadScheduledExecutor單一可排程的Thread

舉個簡單的實例,下面的程式使用newFixedThreadPool方法建立Thread pool,當(dāng)中包括五個可以重復(fù)使用的Thread,您可以指定Runnable物件給它,程式中會產(chǎn)生十個Runnable物件,由于Thread pool中只有五個可用的Thread,所以后來建立的五個Runnable必須等待有空閑的Thread才會被執(zhí)行:
•ExecutorDemo.java
復(fù)制代碼 代碼如下:

package onlyfun.caterpillar;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExecutorDemo {
 public static void main(String[] args) {
  ExecutorService service = Executors.newFixedThreadPool(5);

  for(int i = 0; i < 10; i++) {
   final int count = i;
   service.submit
(new Runnable() {
    public void run() {
     System.out.println(count);
     try {
      Thread.sleep(2000);
     } catch (InterruptedException e) {
      e.printStackTrace();
     }

    }
   });
  }

  service.shutdown(); // 最后記得關(guān)閉Thread pool
 }
}

submit()方法也接受實作Callable介面的物件,最后傳回Future物件,可以取得Callable執(zhí)行過后的傳回結(jié)果。如果想利用Executors進(jìn)行排程,例如排定某個工作30秒后執(zhí)行:
復(fù)制代碼 代碼如下:

ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );       
scheduler.schedule(new Runnable( ) {                              
public void run() {                                  
// 排程工作                              
}                          
},                          
30, TimeUnit.SECONDS);

或排定某個工作5秒后執(zhí)行,之后每30秒執(zhí)行一次:
復(fù)制代碼 代碼如下:

 final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) {                              
 public void run() {                                  
 // 排程工作                                  
 System.out.println("t");                              
 }                          
 },                          
 0, 5, TimeUnit.SECONDS);              
 // 排定 60 秒后取消future       
 scheduler.schedule(new Runnable( ) {           
 public void run( ) {             
 future.cancel(false);           
 }         
 }, 60, TimeUnit.SECONDS);

如上所示,想要取消排程任務(wù),可以呼叫ScheduledFuture的cancel()方法。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 精品国产中文字幕 | 久久精品一区二区三区国产主播 | 黄色网战入口 | 日本一级黄色大片 | 成人一级视频 | 欧美亚洲国产一区 | 精品一区二区三区在线观看视频 | 久久精品视频在线看99 | 欧美日韩一 | 91久久久久 | 午夜精品久久久久久毛片 | 一级做a在线观看 | 午夜激情视频免费 | 国产在线观看av | 91精品国产日韩91久久久久久360 | 中文字幕一区二区三区四区 | 热99精品视频 | 国产美女精品视频 | 免费黄色大片网站 | 一级做人爱c黑人影片 | 国产成人在线观看网站 | 精品国产一区二区三区成人影院 | 午夜精品福利影院 | 中文字幕网站在线 | 欧美在线观看视频一区 | 激情网站在线观看 | 98国内自拍在线视频 | 91精品国产99久久久久久红楼 | xnxx 美女19| 精品国产96亚洲一区二区三区 | 亚洲第一成网站 | 久久精品一级片 | 91av大片| ⅴideo裸体秀hd | 国产精品久久在线观看 | 沉沦的校花奴性郑依婷c到失禁 | 草久在线 | 久久艹艹艹 | 国产精品麻豆一区二区三区 | 久久成人福利 | 国产精品999在线 |