ExecutorService

一個Executor蝎土,提供管理終止的方法和可以生成Future以跟蹤一個或多個異步任務(wù)進(jìn)度的方法。
可以關(guān)閉ExecutorService邢笙,這將導(dǎo)致它拒絕新任務(wù)芋齿。
提供了兩種不同的方法來關(guān)閉ExecutorService:

  • shutdown方法將允許先前提交的任務(wù)在終止之前執(zhí)行
  • shutdownNow方法阻止等待任務(wù)啟動并嘗試停止當(dāng)前正在執(zhí)行的任務(wù)腥寇。終止時,執(zhí)行程序沒有正在執(zhí)行的任務(wù)沟突,沒有等待執(zhí)行的任務(wù)花颗,也沒有任何新任務(wù)可以提交。 應(yīng)關(guān)閉未使用的ExecutorService以允許回收其資源惠拭。

方法submit通過創(chuàng)建并返回可用于取消執(zhí)行和/或等待完成的Future來擴(kuò)展基本方法Executor excute(Runnable)扩劝。 方法invokeAnyinvokeAll執(zhí)行最常用的批量執(zhí)行形式,執(zhí)行一組任務(wù)职辅,然后等待至少一個或全部完成棒呛。 (類ExecutorCompletionService可用于編寫這些方法的自定義變體。)
Executors類為此包中提供的執(zhí)行程序服務(wù)提供工廠方法域携。
下面是網(wǎng)絡(luò)服務(wù)的草圖簇秒,其中線程池中的線程為傳入請求提供服務(wù)。 它使用預(yù)配置的Executors#newFixedThreadPool工廠方法:

class NetworkService implements Runnable {
    private final ServerSocket serverSocket;
    private final ExecutorService pool;
 
    public NetworkService(int port, int poolSize)
        throws IOException {
      serverSocket = new ServerSocket(port);
      pool = Executors.newFixedThreadPool(poolSize);
    }
 
    public void run() { // run the service
      try {
        for (;;) {
          pool.execute(new Handler(serverSocket.accept()));
        }
      } catch (IOException ex) {
        pool.shutdown();
      }
    }
  }
 
  class Handler implements Runnable {
    private final Socket socket;
    Handler(Socket socket) { 
          this.socket = socket; 
    }
    public void run() {
      // read and service request on socket
    }
  }

以下方法分兩個階段關(guān)閉ExecutorService秀鞭,首先調(diào)用shutdown拒絕傳入的任務(wù)趋观,然后在必要時調(diào)用shutdownNow以取消任何延遲的任務(wù):

void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
    try {
      // Wait a while for existing tasks to terminate
      if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
        pool.shutdownNow(); // Cancel currently executing tasks
        // Wait a while for tasks to respond to being cancelled
        if (!pool.awaitTermination(60, TimeUnit.SECONDS))
            System.err.println("Pool did not terminate");
      }
     } catch (InterruptedException ie) {
       // (Re-)Cancel if current thread also interrupted
       pool.shutdownNow();
       // Preserve interrupt status
       Thread.currentThread().interrupt();
     }
  }

Callable<V>

返回結(jié)果并可能拋出異常的任務(wù)。 實(shí)現(xiàn)者定義一個沒有名為call的參數(shù)的方法锋边。
Callable接口類似于java.lang.Runnable皱坛,因?yàn)樗鼈兌际菫槠鋵?shí)例可能由另一個線程執(zhí)行的類而設(shè)計(jì)的。 但是豆巨,Runnable不返回結(jié)果剩辟,也不能拋出已檢查的異常。
Executors類包含將其他常用表單轉(zhuǎn)換為Callable類的實(shí)用程序方法往扔。

V call() throws Exception;

計(jì)算結(jié)果贩猎,或者如果無法執(zhí)行則拋出異常。

Future<V>

Future表示異步計(jì)算的結(jié)果萍膛。 提供方法以檢查計(jì)算是否完成吭服,等待其完成,以及檢索計(jì)算結(jié)果蝗罗。 只有在計(jì)算完成后才能使用方法get檢索結(jié)果艇棕,必要時阻塞直到準(zhǔn)備就緒麦到。 取消由cancel方法執(zhí)行。 提供了其他方法來確定任務(wù)是否正常完成或被取消欠肾。 計(jì)算完成后,無法取消計(jì)算拟赊。 如果您想使用Future以取消可取性但不提供可用的結(jié)果刺桃,您可以聲明Future <?>形式的類型并返回null作為結(jié)果基本任務(wù)吸祟。

interface ArchiveSearcher { String search(String target); }
   class App {
     ExecutorService executor = ...
     ArchiveSearcher searcher = ...
     void showSearch(final String target) throws InterruptedException {
       Future<String> future
         = executor.submit(new Callable<String>() {
           public String call() {
               return searcher.search(target);
           }});
       displayOtherThings(); // do other things while searching
       try {
         displayText(future.get()); // use future
       } catch (ExecutionException ex) { cleanup(); return; }
     }
  }

FutureTask類是實(shí)現(xiàn)RunnableFuture的實(shí)現(xiàn)瑟慈,因此可以由Executor執(zhí)行。 例如屋匕,submit的上述結(jié)構(gòu)可以替換為:

FutureTask<String> future =
     new FutureTask<>(new Callable<String>() {
       public String call() {
         return searcher.search(target);
     }});
   executor.execute(future);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末葛碧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子过吻,更是在濱河造成了極大的恐慌进泼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纤虽,死亡現(xiàn)場離奇詭異乳绕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逼纸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門洋措,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杰刽,你說我怎么就攤上這事菠发。” “怎么了贺嫂?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵滓鸠,是天一觀的道長。 經(jīng)常有香客問我涝婉,道長哥力,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任墩弯,我火速辦了婚禮吩跋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渔工。我一直安慰自己锌钮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布引矩。 她就那樣靜靜地躺著梁丘,像睡著了一般侵浸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上氛谜,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天掏觉,我揣著相機(jī)與錄音,去河邊找鬼值漫。 笑死澳腹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的杨何。 我是一名探鬼主播酱塔,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渡蜻,長吁一口氣:“原來是場噩夢啊……” “哼它浅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闽瓢,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤埃跷,失蹤者是張志新(化名)和其女友劉穎蕊玷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捌蚊,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡集畅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缅糟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挺智。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窗宦,靈堂內(nèi)的尸體忽然破棺而出赦颇,到底是詐尸還是另有隱情,我是刑警寧澤赴涵,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布媒怯,位于F島的核電站,受9級特大地震影響髓窜,放射性物質(zhì)發(fā)生泄漏扇苞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一寄纵、第九天 我趴在偏房一處隱蔽的房頂上張望鳖敷。 院中可真熱鬧,春花似錦程拭、人聲如沸定踱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崖媚。三九已至亦歉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畅哑,已是汗流浹背肴楷。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荠呐,地道東北人阶祭。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像直秆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鞭盟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容