每個 Java 開發人員都應該知道的關于線程、Runnable和線程池的知識
多線程是Java 中最復雜和最強大的部分
多線程章節是 Java 中最難理解和使用的章節。不幸的是,沒有多少資源可以讓您獲得所有答案。同時,并發知識至關重要。在本文中,我解釋了每個 Java 開發人員都必須了解的多線程的核心方面。在這一部分中,我們從 Thread 和 Runnable 主題開始。
為什么并發知識如此重要?
如果沒有良好的多線程知識,您將無法獲得高級 Java 工作
幾乎可以肯定,多線程知識是 Java 高級職位面試的主題。如果沒有對多線程的清晰理解,無論是否有實踐經驗,你很可能會失敗。
幾乎每個生產應用程序都使用多線程范式
在實際項目的實踐中,您將使用應用程序服務器或其替代品。它們都基于線程池等多線程解決方案。任何在其之上的適當實現都需要并發一致性。
線程和可運行定義
多線程基于 Thread 和 Runnable。Thread 是一個啟動新的獨立活動并執行 Runnable 提供的指令的類。
線程是一個附加到操作系統的實體,所以這就是它是一個重類的原因。同時 Runnable 只是一組指令——所以這就是為什么它是輕量級的。
如何執行新線程
線程可以通過使用Run()方法在當前運行的線程內部執行指令。為了在新活動中運行指令,Thread 提供了Start()方法。
如何重用線程
線程可以在其中執行許多可運行的任務。這是一篇更詳細的文章。在這里,您可以看到一個非常簡短的示例,其中許多可運行對象(任務)在一個線程中運行:
如何停止線程
你不能只是stop()或suspend()線程。這些方法已棄用。您必須注意使用isAlive()或的中斷設計isInterrupted()
線程守護進程
線程可以是守護進程。即使最后一部分不會執行,守護線程也會立即中斷。所以這樣的線程可以附加到資源上。否則,它們可能是資源或/和內存泄漏的原因。
如何使用線程池
只要 Thread 實例很重,使用 ThreadPool 類重用相同的 Thread 是有意義的。您可以根據線程使用不同的 ThreadPool 實現。
固定線程池
FixedThreadPool 是一個具有預定義線程數的簡單池。期間線程數不會改變。使用它是有意義的:
緩存線程池
與Fixed Thread Pool相反,這個可以在添加更多任務時動態增加線程數。每個新創建的線程在使用時都將處于活動狀態,否則將在空閑 60 秒后將其刪除。
如何定義線程池中的線程數
為了為您的應用程序使用最好的線程池,您需要了解以下內容:
- 如果您的線程執行大量計算,例如視頻渲染、加密等,那么它會吃掉運行該線程的進程。
- 如果您的線程運行與 CPU 活動(如網絡調用、內存調用等)無關,則它不會消耗運行其線程的 CPU。
依靠這些知識,您可能會得出以下結論:
- 擁有高 CPU 消耗任務的任務分配的線程數不會超過 CPU 內核數。
- 對于 CPU 消耗較低的任務,您可以擁有比 CPU 內核更多的線程(但比例取決于具體情況)。
結論:
本文僅重點介紹有關線程、可運行和線程池概念的主要內容,但并未完全涵蓋。仍有許多方面可能發揮重要作用。我希望你喜歡我使用的信息圖表。如果您認為我遺漏了與此主題相關的重要內容,請留下您的反饋。謝謝閱讀!
*原文鏈接:https://dzone.com/articles/what-every-java-dev-should-know-thread-runnable-thread-pool