併發程式設計遊玩---ExecutorService的isShutdown()和isTerminated(),以及一些方法的區別
阿新 • • 發佈:2019-01-09
log.info("預更新開始"); ExecutorService executorService = PreloadExecutorServiceUtil.newExecutorService(); for (UpdateEnum updateEnum : UpdateEnum.values()) { log.info("更新CMDB..." + updateEnum.getDescription() + "...."); ListenableFutureTask task = ListenableFutureTask.create(new Callable<Object>() { @Override public Object call() throws Exception { updateCmdbData.incremnetUpdate(updateEnum); return ""; } }); executorService.submit(task); //log.info("更新CMDB..." + updateEnum.getDescription() + "結束"); } executorService.shutdown(); //自旋 while (true){ if (executorService.isTerminated()){ log.info("預更新結束"); break; } } }
當呼叫executorService.shutdown()方法的時候,執行緒池並不會立刻關閉,而是會將其中的任務執行完畢才會關閉。
而ShutdownNow()就叼多了,直接關閉,不管還有沒有任務執行。
而只要執行過shutdown()方法,isShutdown()就為true;
而當其中任務執行完成的時候,isTerminated()才為true;
所以採用一個自旋+判斷isTerminated()的方法來確定任務是否執行完成。