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