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