假設您想要執行一些任務。由於透過單一執行緒執行它可能需要相當長的時間才能獲得結果,因此您決定使用可靠的 ExecutorService 透過多個執行緒處理它。
這是一個範例:
public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i { task(temp); }); } executorService.shutdown(); System.out.println("ExecutorService is shutdown"); } private static void task(int temp) { try { TimeUnit.SECONDS.sleep(1L); System.out.println("Task " + temp + " completed"); } catch (InterruptedException e) { throw new RuntimeException(e); } }
當然,像往常一樣,如果不使用「睡眠」作為任務執行的原型,任何執行緒範例都是不完整的。
它輸出,
ExecutorService is shutdown Task 1 completed Task 2 completed Task 0 completed Task 4 completed Task 3 completed
現在想像一下有一個無窮無盡的任務隊列,而你不知道其中的數量。也許它們是由資料庫中動態添加的條目數量決定的。
例如,一家銀行,它必須全天處理大量交易。交易結束時間為下午5點,超過該時間將不再接受任何額外任務。
但是,您確實知道任務的數量是有限的,並且將在某個時間點結束。
如何知道所有任務完成的時間點?
如果您注意到上面的程式碼片段,ExecutorService.shutdown() 會使主執行緒立即退出,但後台執行緒仍然處理已接受的任務直至完成。有什麼方法可以讓您收到完成通知嗎?
我想到了幾個解決方案:
- 使用 CountDownLatch 來計算任務 - 但由於您不知道任務的數量,所以使用它是不切實際的。
- 使用ExecutorService.awaitTermination()。然而,這裡的時間仍然是不確定的。您可以使用非常自由的 ExecutorService.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS) 或類似的東西。但這又是一個阻塞呼叫。
有更好的方法來解決這個問題嗎?
Java 確實提供了一種更好且相對未知的方法來解決這個問題。這裡的「技巧」是要知道 Executors.newFixedThreadPool 本質上是一個具有預定義值的 ThreadPoolExecutor。讓我們來看看 Executors.newFixedThreadPool 的實作。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>()); } </runnable>
我真的建議閱讀這裡的 ThreadPoolExecutor 文件。 ExecutorService 是 ThreadPoolExecutor 的便利包裝。
...強烈建議程式設計師使用更方便的Executors工廠方法Executors.newCachedThreadPool()(無界執行緒池,具有自動執行緒回收功能)、Executors.newFixedThreadPool(int)(固定大小執行緒池)和Executors.newSingleThreadExecutoringleThreadExecutoringle ( )(單後台執行緒),為最常見的使用場景預先配置設定。
將幫助我們解決問題的部分是:
鉤子方法
此類提供了受保護的可重寫 beforeExecute(Thread, Runnable) 和 afterExecute(Runnable, Throwable) 方法,這些方法在每個任務執行之前和之後都被呼叫。這些可用於操縱執行環境;例如,重新初始化 ThreadLocals、收集統計資料或新增日誌條目。此外,可以重寫方法終止()以執行執行器完全終止後需要完成的任何特殊處理。
我們可以使用終止方法來通知我們同樣的事情!但我們該如何使用它呢?
public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(5); for (int i = 0; i { task(temp); }); } executorService.shutdown(); System.out.println("ExecutorService is shutdown"); } private static void task(int temp) { try { TimeUnit.SECONDS.sleep(1L); System.out.println("Task " + temp + " completed"); } catch (InterruptedException e) { throw new RuntimeException(e); } }
如果您不喜歡匿名類別(像我一樣),您始終可以自行擴展 ThreadPoolExecutor 來建立自訂類別。
ExecutorService is shutdown Task 1 completed Task 2 completed Task 0 completed Task 4 completed Task 3 completed
這是驗證它是否按照我們的預期工作的輸出。
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<runnable>()); } </runnable>
您還使用了哪些其他相對未知的片段?請在評論中告訴我!
以上是掌握 ExecutorService 關閉:追蹤線程池終止的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Java在不同操作系統上的表現存在細微差異。 1)JVM實現不同,如HotSpot、OpenJDK,影響性能和垃圾回收。 2)文件系統結構和路徑分隔符不同,需使用Java標準庫處理。 3)網絡協議實現差異影響網絡性能。 4)GUI組件外觀和行為在不同系統上有別。通過使用標準庫和虛擬機測試,可減少這些差異的影響,確保Java程序穩定運行。

javaoffersrobustobject-IentiendedProgrammming(OOP)和Top-Notchsecurityfeatures.1)OopinjavainCludesClasses,對象,繼承,多態性,和列出,andeclingfleximaintainablesys.ss.2)SecurityFeateTuersLudEtersludEterMachine(

JavaScriptandJavahavedistinctstrengths:JavaScriptexcelsindynamictypingandasynchronousprogramming,whileJavaisrobustwithstrongOOPandtyping.1)JavaScript'sdynamicnatureallowsforrapiddevelopmentandprototyping,withasync/awaitfornon-blockingI/O.2)Java'sOOPf

JAVAACHIEVESPLATFORMINDEPENTENCETHROUGHJAVAVIRTAILMACHINE(JVM)和BYTECODE.1)THEJVMINTERPRETSBBYTECODE,允許theingthesmecodetorunonanyanyanyanyplatformwithajvm.2)

java'splatformendependecemeansapplicationscanrunonanyplatformwithajvm,使“ Writeonce,runanywhere”。

JVM'SperformanceIsCompetitiveWithOtherRuntimes,operingabalanceOfspeed,安全性和生產性。 1)JVMUSESJITCOMPILATIONFORDYNAMICOPTIMIZAIZATIONS.2)c提供NativePernativePerformanceButlanceButlactsjvm'ssafetyFeatures.3)

JavaachievesPlatFormIndependencEthroughTheJavavIrtualMachine(JVM),允許CodeTorunonAnyPlatFormWithAjvm.1)codeisscompiledIntobytecode,notmachine-specificodificcode.2)bytecodeisisteredbytheybytheybytheybythejvm,enablingcross-platerssectectectectectross-eenablingcrossectectectectectection.2)

TheJVMisanabstractcomputingmachinecrucialforrunningJavaprogramsduetoitsplatform-independentarchitecture.Itincludes:1)ClassLoaderforloadingclasses,2)RuntimeDataAreafordatastorage,3)ExecutionEnginewithInterpreter,JITCompiler,andGarbageCollectorforbytec


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。