thread
的執(zhí)行是可以由調(diào)度程序獨立管理的最小程序指令序列,調(diào)度程序通常是操作系統(tǒng)的一部分。大多數(shù)情況下,一個線程存在于進程中,而多個線程可以存在于單個進程中,因此是多線程的。
Thread
(線程)時就像化學(xué)家看到Atom
(原子)一樣。
這些threads
同時運行,并且共享資源。threads
在操作系統(tǒng)的實現(xiàn)和進程在操作系統(tǒng)之間有所不同,但是在大多數(shù)情況下,線程是進程的組成部分。
進程是通常彼此獨立運行的程序的實例。例如,如果啟動Java程序,則操作系統(tǒng)會產(chǎn)生一個新程序,該程序process
(進程)可與其他程序并行運行。在這些進程中,我們可以利用線程并發(fā)執(zhí)行代碼,因此我們可以充分利用CPU的可用內(nèi)核。
創(chuàng)建一個全新的OS線程需要內(nèi)存分配和CPU指令,以便對其進行設(shè)置和銷毀。為了更好地處理線程的使用并避免創(chuàng)建新線程,操作系統(tǒng)或平臺考慮了一項Thread Pool
(線程池)功能,該功能使應(yīng)用程序可以使用已經(jīng)存在的線程。
這是處理多個線程而不處理其創(chuàng)建或銷毀的更有效的方法。此外,操作系統(tǒng)知道何時未積極使用線程池中的線程,因此它們可以在線程迭代期間自動“跳過”它。
我們將研究從JavaExecutors
和Java中的兩個類實現(xiàn)的線程Runnable
。
Executors
是Java中的一類,抽象了大多數(shù)手動線程創(chuàng)建過程。它們能夠運行異步任務(wù),通??梢怨芾砭€程池,因此我們不必手動創(chuàng)建新線程。該類Executors
提供了方便的工廠方法來創(chuàng)建各種執(zhí)行程序服務(wù)。在下面的示例中,我們使用大小為1的線程池的執(zhí)行程序。
Executors
必須明確停止-否則他們會繼續(xù)聽新任務(wù)。
ExecutorService
提供了兩種方法用于此目的:shutdown()
等待當前正在運行的任務(wù)完成,同時shutdownNow()
中斷所有正在運行的任務(wù),并立即關(guān)閉執(zhí)行程序。此服務(wù)通常在使用套接字連接時使用,以促進異步調(diào)用(Sink-Source連接)。
Runnable
是定義單個空隙無參數(shù)方法功能接口run()
。在開始新線程之前,您必須指定此線程要執(zhí)行的代碼,通常稱為任務(wù),這是通過實現(xiàn)來完成的Runnable
。請注意,您可以擁有盡可能多的任務(wù)。Hello main
Hello Thread-0
Done!
或者這樣:
Hello main
Done!
Hello Thread-0
我們有兩個可能的輸出,因為由于并發(fā)執(zhí)行,我們無法預(yù)測在打印之前還是之后將調(diào)用runnable。該順序是不確定的,因此使得并發(fā)編程在大型應(yīng)用程序中成為一項復(fù)雜的任務(wù)。盡管線程也可以處于一定的睡眠時間。
就像我們前面已經(jīng)明確指出的那樣,一個multi-threaded
(多線程)程序包含兩個或多個可以同時運行的部分,并且每個部分可以同時處理不同的任務(wù),特別是在計算機具有多個CPU時,可以最佳利用可用資源。
Multi-threading
(多線程)將多任務(wù)處理的概念擴展到了應(yīng)用程序中,您可以在其中將單個應(yīng)用程序中的特定操作細分為各個線程。它使您可以編寫一種方式,使多個活動可以在同一程序中同時進行。
有幾種編程語言可以為騰出空間multi-threading
,并且大多數(shù)語言是面向?qū)ο蟮木幊陶Z言(OOP)。語言,如Java
,C
,C++
甚至.NET
框架。其他一些解釋型語言也有所作為,例如Ruby MRI
forRuby
和CPython
for Python
。如果您等著看Javascript
,那么您將不是因為JavaScript
不支持多線程,而是因為JavaScript
瀏覽器中的解釋器是一個單線程。
幾乎所有構(gòu)建良好的應(yīng)用程序都支持多線程。讓我們看一下瀏覽器。大多數(shù)瀏覽器都是多線程的,從firefox
到Safari
到Chrome
還有許多其他。但是今天我們要詳細討論Chrome
。
Chrome具有多進程架構(gòu),并且每個進程都是高度多線程的。主要目標是使主線程(瀏覽器進程中的“ UI”線程)和IO線程(用于處理IPC的每個進程的線程)保持響應(yīng)。這意味著將任何阻塞的I / O或其他昂貴的操作卸載到其他線程。
在Chrome
中,您打開的每個選項卡都有其自己的內(nèi)容處理。五個標簽,5個進程,一百個標簽,100個進程。這種方法可最大程度地提高性能,但您會在內(nèi)存消耗和電池壽命方面付出沉重的代價。有沒有想過為什么任務(wù)管理器上的Chrome的CPU消耗總是很高?好吧,你去。
每個 chrome 進程都有
main thread
此線程更新UI并運行大多數(shù)Blink。IO thread
此線程句柄的IPC和網(wǎng)絡(luò)請求special-purpose threads
general-purpose threads
雖然Chrome會為每個選項卡創(chuàng)建一個內(nèi)容處理Firefox,但默認情況下最多旋轉(zhuǎn)四個內(nèi)容處理線程。在Firefox中,前4個標簽分別使用這4個進程,其他標簽則使用這些進程中的線程。一個進程中的多個選項卡共享內(nèi)存中已經(jīng)存在的瀏覽器引擎,而不是每個選項卡都創(chuàng)建自己的瀏覽器。
線程在許多方面與傳統(tǒng)的多任務(wù)處理過程不同:
并行性與工作分散在多個單元中的概念有關(guān),以這種方式不會損害最終產(chǎn)品,但會減少總執(zhí)行時間。
并行執(zhí)行是兩個(或多個)任務(wù)同時運行的能力。雖然并發(fā)代表了可能性,但并行是現(xiàn)實。
現(xiàn)在,多線程已成為現(xiàn)代軟件開發(fā)的重要組成部分。它受到許多編程語言和平臺的支持,并一直延伸到操作系統(tǒng)。知道如何使用多個線程可以肯定會導(dǎo)致開發(fā)人員構(gòu)建更好的應(yīng)用程序。
關(guān)注作者公眾號【海擁】回復(fù)【進群】,免費下載CSDN資源和百度文庫資源
后面我還會持續(xù)更新類似免費好玩的H5小游戲、Java小游戲、好玩、實用的項目和軟件等等
最后,不要忘了?或📑支持一下哦
聯(lián)系客服