Java 8 ExecutorService

ExecutorService 類圖

ExecutorService.jpg

ExecutorService被終止后,會(huì)拒絕執(zhí)行新的任務(wù)。ExecutorService提供了2個(gè)終止方法:

  • shutdown()方法將會(huì)在終止之前執(zhí)行預(yù)先制定好要提交的任務(wù)。
  • shutdownNow() 方法阻止等待執(zhí)行的任務(wù),并嘗試終止正在執(zhí)行的任務(wù)。

ExecutorService終止后,executor不會(huì)有要執(zhí)行的任務(wù),不會(huì)有等待執(zhí)行的任務(wù),也不會(huì)沒(méi)有被提交的任務(wù)。沒(méi)有被使用的ExectorService應(yīng)該被終止,以此來(lái)釋放其占用的資源。

submit方法通過(guò)創(chuàng)建并返回Future來(lái)擴(kuò)展Exector.execute(Runnable)方法,Futrue可以用來(lái)取消執(zhí)行或等待完成的任務(wù)。invokeAnyinvokeAll是最常見(jiàn)的用來(lái)批量執(zhí)行任務(wù)的方法,它們通常執(zhí)行一組任務(wù),然后等待至少一個(gè)或者全部任務(wù)完成。

Executors類為這個(gè)包中的executor服務(wù)提供工廠方法。

下面的代碼展示了在網(wǎng)絡(luò)服務(wù)中使用線程池中的線程來(lái)接受網(wǎng)絡(luò)請(qǐng)求的情形。代碼中使用了Executors已經(jīng)寫(xiě)好的方法 executor.newfixedthreadpool (int):

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);
   }

   // 運(yùn)行
   public void run() {
     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
   }
}

下面的方法分兩個(gè)階段關(guān)閉ExecutorService,首先調(diào)用shutdown防止新任務(wù)被提交,然后調(diào)用shutdownNow(如果需要的話)來(lái)取消等待執(zhí)行的任務(wù):

void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // 防止新任務(wù)被提交
   try {
     // 正在執(zhí)行的任務(wù)停止之前等待一小會(huì)
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // 取消當(dāng)前正在執(zhí)行的任務(wù)
       // 被取消的任務(wù)有相應(yīng)前等待一小會(huì)
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // 如果當(dāng)前線程被打斷,重新發(fā)起取消執(zhí)行
     pool.shutdownNow();
     // 保持中斷狀態(tài)
     Thread.currentThread().interrupt();
   }
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容