java thread類詳解 handlerthread與handler區(qū)別?
handlerthread與handler區(qū)別?①Handl對(duì)于多核CPU java中() 指的是哪個(gè)核上的線程?Java和線程類庫(kù)沒有提供任何API來獲取CPU的核心信息。如上圖所示,java使用操
handlerthread與handler區(qū)別?
①Handl
對(duì)于多核CPU java中() 指的是哪個(gè)核上的線程?
Java和線程類庫(kù)沒有提供任何API來獲取CPU的核心信息。
如上圖所示,java使用操作系統(tǒng)的輕量級(jí)進(jìn)程接口實(shí)現(xiàn)線程,輕量級(jí)進(jìn)程與內(nèi)核線程一一對(duì)應(yīng)。內(nèi)核線程由操作系統(tǒng)調(diào)度,并分配給CPU內(nèi)核執(zhí)行。換句話說,java虛擬機(jī)不會(huì)直接調(diào)用CPU,而是將任務(wù)提交給操作系統(tǒng),由CPU的哪個(gè)內(nèi)核來執(zhí)行線程。
在大多數(shù)情況下,java程序不支持。;不需要關(guān)心線程是由哪個(gè)CPU內(nèi)核執(zhí)行的,因?yàn)閖ava程序可以 除非使用JNI調(diào)用一些低級(jí)操作,否則對(duì)操作系統(tǒng)的線程調(diào)度沒有任何影響。在這種情況下,你可以 不要通過java 自己的線程類庫(kù)。
如何理解應(yīng)用Java多線程與并發(fā)編程?
多線程:在理解線程之前,你應(yīng)該知道進(jìn)程的概念。進(jìn)程是一個(gè)程序的運(yùn)行活動(dòng),它具有關(guān)于數(shù)據(jù)集的獨(dú)立功能。簡(jiǎn)單來說,進(jìn)程就是一個(gè)正在執(zhí)行的程序活動(dòng),是一個(gè)活動(dòng)的實(shí)體。多流程就像同時(shí)打開Word、Excel、Visio。都是不同的程序運(yùn)行活動(dòng),也就是多個(gè)進(jìn)程同時(shí)啟動(dòng)。這個(gè)概念比較好理解。線程是為正在執(zhí)行的程序活動(dòng)(即進(jìn)程)的多個(gè)執(zhí)行路徑執(zhí)行調(diào)度的單元。線程是在一個(gè)進(jìn)程的基礎(chǔ)上存在的,在這個(gè)進(jìn)程下,它們可以共享進(jìn)程的內(nèi)存,擁有自己的內(nèi)存空間。這個(gè)內(nèi)存空間,也叫線程棧,是線程建立時(shí)系統(tǒng)分配的,主要用來保存線程內(nèi)部使用的數(shù)據(jù)。多線程意味著一個(gè)進(jìn)程下有多個(gè)線程。每個(gè)線程執(zhí)行自己的任務(wù),這些線程可以 "同時(shí)做這件事(此處加雙引號(hào),下面會(huì)說明加雙引號(hào)的原因)。多線程有什么好處?多線程應(yīng)用在生活中隨處可見,Word文檔就是一個(gè)很好的例子。Word有 "背景打印 "。點(diǎn)擊打印按鈕后,如果用戶發(fā)現(xiàn)可以修改當(dāng)前文本,可以在打印過程中返回主界面進(jìn)行修改并保存。如果沒有應(yīng)用多線程,可能會(huì)假設(shè)用戶要打印的文本很長(zhǎng),所以用戶只能在打印操作完成后才能修改、編輯和保存文本,這樣用戶體驗(yàn)不是。和多線程一樣好。還有打雷。有沒有發(fā)現(xiàn)迅雷可以同時(shí)下載東西?比如同時(shí)下載A、B、A為53.4%,下載B為47.1%。有時(shí)候A更快,有時(shí)候B更快。反正A和B在下載內(nèi)容是肯定的,不用等A下載完,B就可以開始下載了,這也是多線程的作用。因此,多線程強(qiáng)調(diào) "同時(shí),一起 "而不是單一的順序操作。
并發(fā):Concurrency,就是并發(fā)的意思。并發(fā)的本質(zhì)是一個(gè)物理CPU(或多個(gè)物理CPU)在幾個(gè)程序(或線程)之間復(fù)用,并發(fā)是強(qiáng)制多用戶共享有限的物理資源以提高效率。微觀視角:所有并發(fā)處理都有排隊(duì)等待、喚醒、執(zhí)行等步驟。顯微鏡下都是按順序加工的。如果請(qǐng)求(或線程)同時(shí)到達(dá),它們將根據(jù)不同的優(yōu)先級(jí)進(jìn)入隊(duì)列執(zhí)行。從宏觀上看,幾乎同時(shí)到達(dá)的多個(gè)請(qǐng)求(或線程)似乎同時(shí)被處理。一般來說,并發(fā)是指只有一個(gè)CPU資源,程序(或線程)要競(jìng)爭(zhēng)執(zhí)行機(jī)會(huì)。圖中第一階段,在A執(zhí)行的過程中不會(huì)執(zhí)行B和C,因?yàn)檫@段時(shí)間這個(gè)CPU資源已經(jīng)被A競(jìng)爭(zhēng)了。類似地,只有B在第二階段執(zhí)行,只有C在第三階段執(zhí)行。其實(shí)在并發(fā)過程中,A、B、C并不是同時(shí)進(jìn)行的(微角度)。但同時(shí)(宏觀角度)。
并行性:并行性是指兩個(gè)或兩個(gè)以上的事件(或線程)同時(shí)發(fā)生,也就是不同的事件或線程同時(shí)在不同的CPU資源(多核)上執(zhí)行。并行,沒有并發(fā)之類的競(jìng)爭(zhēng)和等待的概念。圖中A、B、C都在同時(shí)運(yùn)行(微觀和宏觀)。
通過多線程實(shí)現(xiàn)并發(fā)和并行:java中的Thread類定義了多線程,可以實(shí)現(xiàn)并發(fā)或者并行。當(dāng)CPU繁忙,資源不足時(shí)(啟動(dòng)了很多進(jìn)程),操作系統(tǒng)只把僅有的CPU資源分配給一個(gè)有多個(gè)線程的進(jìn)程,這些線程會(huì)盡量為自己搶占盡可能多的時(shí)間片。這是通過多線程來實(shí)現(xiàn)并發(fā),線程會(huì)爭(zhēng)奪CPU資源來獲得執(zhí)行機(jī)會(huì)。當(dāng)CPU資源充足時(shí),一個(gè)進(jìn)程中的多線程可以分配給不同的CPU資源,就是通過多線程實(shí)現(xiàn)并行。至于多線程是并發(fā)還是并行?如上所述,編寫的多線程可以分配給CPU內(nèi)核執(zhí)行,也可以分配給不同的CPU執(zhí)行。分配過程由操作系統(tǒng)完成,不能人為控制。所以,如果有人問我寫的多線程是并發(fā)的還是并行的?我會(huì)說,它 一切皆有可能。無論是并發(fā)還是并行,都提高了程序?qū)PU資源的利用率,最大化善用CPU資源。