欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    么是線程

    線程是程序執(zhí)行的最小單元,一個標準的線程是由線程ID、當前指令指針(PC)、寄存器集合和堆棧組成。此外線程是進程中的一個實體,是被系統(tǒng)獨立調用和分配的基本單位。線程的運行只需要一些必不可少的資源,但它與同屬于同一個進程的其他線程共享進程所擁有的的全部資源。一個線程可以創(chuàng)建和銷毀另一個線程,同一進程中可以并發(fā)執(zhí)行多個線程。由于線程之間相互之約,線程在運行的過程中是交替使用CPU的,所以呈現(xiàn)出間斷性。

    線程有三種基本狀態(tài):就緒、阻塞和運行。

    就緒狀態(tài)是指線程具備了運行的所有條件,在邏輯上已經是可執(zhí)行的,就在等待時間一到就可以執(zhí)行;運行狀態(tài)是指線正在占用處理機,正在運行中;阻塞狀態(tài)是指線程在等待另一個線程執(zhí)行完成。

    每個程序進程至少有一個線程,如果一個程序進程只有一個線程,那么這個線程就是程序進程本身。

    線程是程序中一個單一的順序控制流程,是在一個進程內部相對獨立、可以調度地執(zhí)行單元。在單個程序中多個線程可以完成多個不同的任務,這個操作就被稱為是多線程機制,在多少的系統(tǒng)中多線程都可以很大程度的提升執(zhí)行效率。


    進程與線程

    進程和線程是并發(fā)編程的基本概念,在大多數(shù)的編程語言中都有進程和線程的概念。

    一個計算機系統(tǒng)中通常可以有多個線程和多個進程存在,但是在給定的時間內,每個處理器只能處理一個進程的任務。對于單核的處理來說,處理時間是通過時間片在進程和線程之間切換進行共享。

    進程有一個相對獨立的執(zhí)行環(huán)境,通常有一個完整的、私有的運行時間資源。每個進程都有自己獨立的內存空間,操作系統(tǒng)的進程表(Process Table)存儲了CPU寄存器的值、內存映射、打開的文件、統(tǒng)計信息和特權信息等信息。進程一般是被定義為執(zhí)行中的程序,也就是當前操作系統(tǒng)上某個虛擬處理器上運行的一個程序。多個進程并發(fā)共享同一個CPU的硬件資源。而操作系統(tǒng)是支持進程之間的相對隔離,實現(xiàn)這種并發(fā)透明需要付出的成本也是相對較高的。

    在一般情況下,進程可以看做是一個程序。但在用戶看到的一個獨立運行的程序則是由很多的進程協(xié)同完成。而大多數(shù)的操作系統(tǒng)都是支持進程之間通信(IPC),例如管道和Socket。IPC不僅可以用來完成同一個系統(tǒng)的進程通信,還可以用于不同系統(tǒng)之間的進程通信。

    線程,被稱為是輕量級的進程,進程和線程都提供了一個執(zhí)行環(huán)境,但是創(chuàng)建一個新的線程要比創(chuàng)建一個新的線程需要更少的資源。線程系統(tǒng)一般只維護一些用來讓多個線程共享CPU所必需的最少的信息,特別是線程上下文(Thread Context)中一般只包含CPU上下文以及某些其他線程的管理信息,通常會忽略那些對于多線程管理不必要的信息。這樣單個進程中為了防止數(shù)據(jù)遭到某些不合法線程的訪問就完全落在應用程序開發(fā)人員手中。線程不像是進程那樣彼此之間是隔離的,而且還會受到操作系統(tǒng)的保護,所以在多線程程序開發(fā)過程中需要開發(fā)人員時刻關注線程安全問題。

    我們都知道計算機的核心是CPU,它承擔了所有的計算任務;而操作系統(tǒng)是計算機的管理者,它負責任務的調度、資源的分配和管理,統(tǒng)領整個計算機硬件;應用程序則是具有某種功能的程序,程序是運行于操作系統(tǒng)之上的。

    進程是一個具有一定獨立功能的程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行的過程,是操作系統(tǒng)進行資源分配和調度的一個獨立單位,是應用程序運行的載體。進程是一種抽象的概念,從來沒有統(tǒng)一的標準定義。

    進程一般由程序、數(shù)據(jù)集合和進程控制塊三部分組成。

    • 程序用于描述進程要完成的功能,是控制進程執(zhí)行的指令集;
    • 數(shù)據(jù)集合是程序在執(zhí)行時所需要的數(shù)據(jù)和工作區(qū);
    • 程序控制塊(Program Control Block,簡稱PCB),包含進程的描述信息和控制信息,是進程存在的唯一標志。

    進程具有的特征:

    • 動態(tài)性:進程是程序的一次執(zhí)行過程,是臨時的,有生命期的,是動態(tài)產生,動態(tài)消亡的;
    • 并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行;
    • 獨立性:進程是系統(tǒng)進行資源分配和調度的一個獨立單位;
    • 結構性:進程由程序、數(shù)據(jù)和進程控制塊三部分組成。

    線程

    在早期的操作系統(tǒng)中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執(zhí)行的最小單位。任務調度采用的是時間片輪轉的搶占式調度方式,而進程是任務調度的最小單位,每個進程有各自獨立的一塊內存,使得各個進程之間內存地址相互隔離。

    后來,隨著計算機的發(fā)展,對CPU的要求越來越高,進程之間的切換開銷較大,已經無法滿足越來越復雜的程序的要求了。于是就發(fā)明了線程。

    線程是程序執(zhí)行中一個單一的順序控制流程,是程序執(zhí)行流的最小單元,是處理器調度和分派的基本單位。一個進程可以有一個或多個線程,各個線程之間共享程序的內存空間(也就是所在進程的內存空間)。一個標準的線程由線程ID、當前指令指針(PC)、寄存器和堆棧組成。而進程由內存空間(代碼、數(shù)據(jù)、進程空間、打開的文件)和一個或多個線程組成。

    (讀到這里可能有的讀者迷糊,感覺這和Java的內存空間模型不太一樣,但如果你深入的讀過《深入理解Java虛擬機》這本書的話你就會恍然大悟)



    如上圖,在任務管理器的進程一欄里,有道詞典和有道云筆記就是進程,而在進程下又有著多個執(zhí)行不同任務的線程。

    任務調度

    線程是什么?要理解這個概念,需要先了解一下操作系統(tǒng)的一些相關概念。大部分操作系統(tǒng)(如Windows、Linux)的任務調度是采用時間片輪轉的搶占式調度方式。

    在一個進程中,當一個線程任務執(zhí)行幾毫秒后,會由操作系統(tǒng)的內核(負責管理各個任務)進行調度,通過硬件的計數(shù)器中斷處理器,讓該線程強制暫停并將該線程的寄存器放入內存中,通過查看線程列表決定接下來執(zhí)行哪一個線程,并從內存中恢復該線程的寄存器,最后恢復該線程的執(zhí)行,從而去執(zhí)行下一個任務。

    上述過程中,任務執(zhí)行的那一小段時間叫做時間片,任務正在執(zhí)行時的狀態(tài)叫運行狀態(tài),被暫停的線程任務狀態(tài)叫做就緒狀態(tài),意為等待下一個屬于它的時間片的到來。

    這種方式保證了每個線程輪流執(zhí)行,由于CPU的執(zhí)行效率非常高,時間片非常短,在各個任務之間快速地切換,給人的感覺就是多個任務在“同時進行”,這也就是我們所說的并發(fā)(別覺得并發(fā)有多高深,它的實現(xiàn)很復雜,但它的概念很簡單,就是一句話:多個任務同時執(zhí)行)。多任務運行過程的示意圖如下:


    操作系統(tǒng)中的任務調度

    進程與線程的區(qū)別

    前面講了進程與線程,但可能你還覺得迷糊,感覺他們很類似。的確,進程與線程有著千絲萬縷的關系,下面就讓我們一起來理一理:

    1. 線程是程序執(zhí)行的最小單位,而進程是操作系統(tǒng)分配資源的最小單位;
    2. 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執(zhí)行路線;
    3. 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數(shù)據(jù)集、堆等)及一些進程級的資源(如打開文件和信號),某進程內的線程在其它進程不可見;
    4. 調度和切換:線程上下文切換比進程上下文切換要快得多。

    線程與進程關系的示意圖:


    進程與線程的資源共享關系


    單線程與多線程的關系


    總之,線程和進程都是一種抽象的概念,線程是一種比進程更小的抽象,線程和進程都可用于實現(xiàn)并發(fā)。

    在早期的操作系統(tǒng)中并沒有線程的概念,進程是能擁有資源和獨立運行的最小單位,也是程序執(zhí)行的最小單位。它相當于一個進程里只有一個線程,進程本身就是線程。所以線程有時被稱為輕量級進程(Lightweight Process,LWP)。


    早期的操作系統(tǒng)只有進程,沒有線程

    后來,隨著計算機的發(fā)展,對多個任務之間上下文切換的效率要求越來越高,就抽象出一個更小的概念——線程,一般一個進程會有多個(也可是一個)線程。


    線程的出現(xiàn),使得一個進程可以有多個線程


    多線程與多核

    上面提到的時間片輪轉的調度方式說一個任務執(zhí)行一小段時間后強制暫停去執(zhí)行下一個任務,每個任務輪流執(zhí)行。很多操作系統(tǒng)的書都說“同一時間點只有一個任務在執(zhí)行”。那有人可能就要問雙核處理器呢?難道兩個核不是同時運行嗎?

    其實“同一時間點只有一個任務在執(zhí)行”這句話是不準確的,至少它是不全面的。那多核處理器的情況下,線程是怎樣執(zhí)行呢?這就需要了解內核線程。

    多核(心)處理器是指在一個處理器上集成多個運算核心從而提高計算能力,也就是有多個真正并行計算的處理核心,每一個處理核心對應一個內核線程。

    內核線程(Kernel Thread,KLT)就是直接由操作系統(tǒng)內核支持的線程,這種線程由內核來完成線程切換,內核通過操作調度器對線程進行調度,并負責將線程的任務映射到各個處理器上。一般一個處理核心對應一個內核線程,比如單核處理器對應一個內核線程,雙核處理器對應兩個內核線程,四核處理器對應四個內核線程。

    現(xiàn)在的電腦一般是雙核四線程、四核八線程,是采用超線程技術將一個物理處理核心模擬成兩個邏輯處理核心,對應兩個內核線程,所以在操作系統(tǒng)中看到的CPU數(shù)量是實際物理CPU數(shù)量的兩倍,如你的電腦是雙核四線程,打開“任務管理器\性能”可以看到4個CPU的監(jiān)視器,四核八線程可以看到8個CPU的監(jiān)視器。


    雙核四線程在Windows8下查看的結果


    超線程技術就是利用特殊的硬件指令,把一個物理芯片模擬成兩個邏輯處理核心,讓單個處理器都能使用線程級并行計算,進而兼容多線程操作系統(tǒng)和軟件,減少了CPU的閑置時間,提高的CPU的運行效率。這種超線程技術(如雙核四線程)由處理器硬件的決定,同時也需要操作系統(tǒng)的支持才能在計算機中表現(xiàn)出來。

    程序一般不會直接去使用內核線程,而是去使用內核線程的一種高級接口——輕量級進程(Lightweight Process,LWP),輕量級進程就是我們通常意義上所講的線程,也被叫做用戶線程。由于每個輕量級進程都由一個內核線程支持,因此只有先支持內核線程,才能有輕量級進程。用戶線程與內核線程的對應關系有三種模型:一對一模型、多對一模型、多對多模型,在這以4個內核線程、3個用戶線程為例對三種模型進行說明。

    一對一模型

    對于一對一模型來說,一個用戶線程就唯一地對應一個內核線程(反過來不一定成立,一個內核線程不一定有對應的用戶線程)。這樣,如果CPU沒有采用超線程技術(如四核四線程的計算機),一個用戶線程就唯一地映射到一個物理CPU的內核線程,線程之間的并發(fā)是真正的并發(fā)。一對一模型使用戶線程具有與內核線程一樣的優(yōu)點,一個線程因某種原因阻塞時其他線程的執(zhí)行不受影響;此處,一對一模型也可以讓多線程程序在多處理器的系統(tǒng)上有更好的表現(xiàn)。

    但一對一模型也有兩個缺點:

    1. 許多操作系統(tǒng)限制了內核線程的數(shù)量,因此一對一模型會使用戶線程的數(shù)量受到限制;
    2. 許多操作系統(tǒng)內核線程調度時,上下文切換的開銷較大,導致用戶線程的執(zhí)行效率下降。


    一對一模型

    多對一模型

    多對一模型將多個用戶線程映射到一個內核線程上,線程之間的切換由用戶態(tài)的代碼來進行,系統(tǒng)內核感受不到線程的實現(xiàn)方式。用戶線程的建立、同步、銷毀等都在用戶態(tài)中完成,不需要內核的介入。因此相對一對一模型,多對一模型的線程上下文切換速度要快許多;此外,多對一模型對用戶線程的數(shù)量幾乎無限制。

    但多對一模型也有兩個缺點:

    1. 如果其中一個用戶線程阻塞,那么其它所有線程都將無法執(zhí)行,因為此時內核線程也隨之阻塞了;
    2. 在多處理器系統(tǒng)上,處理器數(shù)量的增加對多對一模型的線程性能不會有明顯的增加,因為所有的用戶線程都映射到一個處理器上了。


    多對一模型

    多對多模型

    多對多模型結合了一對一模型和多對一模型的優(yōu)點,將多個用戶線程映射到多個內核線程上。由線程庫負責在可用的可調度實體上調度用戶線程,這使得線程的上下文切換非常快,因為它避免了系統(tǒng)調用。但是增加了復雜性和優(yōu)先級倒置的可能性,以及在用戶態(tài)調度程序和內核調度程序之間沒有廣泛(且高昂)協(xié)調的次優(yōu)調度。

    多對多模型的優(yōu)點有:

    1. 一個用戶線程的阻塞不會導致所有線程的阻塞,因為此時還有別的內核線程被調度來執(zhí)行;
    2. 多對多模型對用戶線程的數(shù)量沒有限制;
    3. 在多處理器的操作系統(tǒng)中,多對多模型的線程也能得到一定的性能提升,但提升的幅度不如一對一模型的高。


    多對多模型


    在現(xiàn)在流行的操作系統(tǒng)中,大都采用多對多的模型。

    查看進程與線程

    一個應用程序可能是多線程的,也可能是多進程的,如何查看呢?在Windows下我們只須打開任務管理器就能查看一個應用程序的進程和線程數(shù)。按“Ctrl+Alt+Del”或右鍵快捷工具欄打開任務管理器。

    查看進程數(shù)和線程數(shù):


    查看線程數(shù)和進程數(shù)


    在“進程”選項卡下,我們可以看到一個應用程序包含的線程數(shù)。如果一個應用程序有多個進程,我們能看到每一個進程,如在上圖中,Google的Chrome瀏覽器就有多個進程。同時,如果打開了一個應用程序的多個實例也會有多個進程,如上圖中我打開了兩個cmd窗口,就有兩個cmd進程。如果看不到線程數(shù)這一列,可以再點擊“查看\選擇列”菜單,增加監(jiān)聽的列。

    查看CPU和內存的使用率:

    在性能選項卡中,我們可以查看CPU和內存的使用率,根據(jù)CPU使用記錄的監(jiān)視器的個數(shù)還能看出邏輯處理核心的個數(shù),如我的雙核四線程的計算機就有四個監(jiān)視器。


    查看CPU和內存的使用率

    線程的生命周期

    當線程的數(shù)量小于處理器的數(shù)量時,線程的并發(fā)是真正的并發(fā),不同的線程運行在不同的處理器上。但當線程的數(shù)量大于處理器的數(shù)量時,線程的并發(fā)會受到一些阻礙,此時并不是真正的并發(fā),因為此時至少有一個處理器會運行多個線程。

    在單個處理器運行多個線程時,并發(fā)是一種模擬出來的狀態(tài)。操作系統(tǒng)采用時間片輪轉的方式輪流執(zhí)行每一個線程。現(xiàn)在,幾乎所有的現(xiàn)代操作系統(tǒng)采用的都是時間片輪轉的搶占式調度方式,如我們熟悉的Unix、Linux、Windows及macOS等流行的操作系統(tǒng)。

    我們知道線程是程序執(zhí)行的最小單位,也是任務執(zhí)行的最小單位。在早期只有進程的操作系統(tǒng)中,進程有五種狀態(tài),創(chuàng)建、就緒、運行、阻塞(等待)、退出。早期的進程相當于現(xiàn)在的只有單個線程的進程,那么現(xiàn)在的多線程也有五種狀態(tài),現(xiàn)在的多線程的生命周期與早期進程的生命周期類似。

    早期進程的生命周期

    進程在運行過程有三種狀態(tài):就緒、運行、阻塞,創(chuàng)建和退出狀態(tài)描述的是進程的創(chuàng)建過程和退出過程。

    • 創(chuàng)建:進程正在創(chuàng)建,還不能運行。操作系統(tǒng)在創(chuàng)建進程時要進行的工作包括分配和建立進程控制塊表項、建立資源表格并分配資源、加載程序并建立地址空間;
    • 就緒:時間片已用完,此線程被強制暫停,等待下一個屬于它的時間片到來;
    • 運行:此線程正在執(zhí)行,正在占用時間片;
    • 阻塞:也叫等待狀態(tài),等待某一事件(如IO或另一個線程)執(zhí)行完;
    • 退出:進程已結束,所以也稱結束狀態(tài),釋放操作系統(tǒng)分配的資源。


    線程的生命周期


    • 創(chuàng)建:一個新的線程被創(chuàng)建,等待該線程被調用執(zhí)行;
    • 就緒:時間片已用完,此線程被強制暫停,等待下一個屬于它的時間片到來;
    • 運行:此線程正在執(zhí)行,正在占用時間片;
    • 阻塞:也叫等待狀態(tài),等待某一事件(如IO或另一個線程)執(zhí)行完;
    • 退出:一個線程完成任務或者其他終止條件發(fā)生,該線程終止進入退出狀態(tài),退出狀態(tài)釋放該線程所分配的資源。

    協(xié)程

    協(xié)程,英文Coroutines,是一種基于線程之上,但又比線程更加輕量級的存在,這種由程序員自己寫程序來管理的輕量級線程叫做『用戶空間線程』,具有對內核來說不可見的特性。

    因為是自主開辟的異步任務,所以很多人也更喜歡叫它們纖程(Fiber),或者綠色線程(GreenThread)。正如一個進程可以擁有多個線程一樣,一個線程也可以擁有多個協(xié)程。



    協(xié)程的目的

    在傳統(tǒng)的J2EE系統(tǒng)中都是基于每個請求占用一個線程去完成完整的業(yè)務邏輯(包括事務)。所以系統(tǒng)的吞吐能力取決于每個線程的操作耗時。如果遇到很耗時的I/O行為,則整個系統(tǒng)的吞吐立刻下降,因為這個時候線程一直處于阻塞狀態(tài),如果線程很多的時候,會存在很多線程處于空閑狀態(tài)(等待該線程執(zhí)行完才能執(zhí)行),造成了資源應用不徹底。

    最常見的例子就是JDBC(它是同步阻塞的),這也是為什么很多人都說數(shù)據(jù)庫是瓶頸的原因。這里的耗時其實是讓CPU一直在等待I/O返回,說白了線程根本沒有利用CPU去做運算,而是處于空轉狀態(tài)。而另外過多的線程,也會帶來更多的ContextSwitch開銷。

    對于上述問題,現(xiàn)階段行業(yè)里的比較流行的解決方案之一就是單線程加上異步回調。其代表派是node.js以及Java里的新秀Vert.x。

    而協(xié)程的目的就是當出現(xiàn)長時間的I/O操作時,通過讓出目前的協(xié)程調度,執(zhí)行下一個任務的方式,來消除ContextSwitch上的開銷。

    協(xié)程的特點

    1. 線程的切換由操作系統(tǒng)負責調度,協(xié)程由用戶自己進行調度,因此減少了上下文切換,提高了效率。
    2. 線程的默認Stack大小是1M,而協(xié)程更輕量,接近1K。因此可以在相同的內存中開啟更多的協(xié)程。
    3. 由于在同一個線程上,因此可以避免競爭關系而使用鎖。
    4. 適用于被阻塞的,且需要大量并發(fā)的場景。但不適用于大量計算的多線程,遇到此種情況,更好實用線程去解決。

    協(xié)程的原理

    當出現(xiàn)IO阻塞的時候,由協(xié)程的調度器進行調度,通過將數(shù)據(jù)流立刻yield掉(主動讓出),并且記錄當前棧上的數(shù)據(jù),阻塞完后立刻再通過線程恢復棧,并把阻塞的結果放到這個線程上去跑,這樣看上去好像跟寫同步代碼沒有任何差別,這整個流程可以稱為coroutine,而跑在由coroutine負責調度的線程稱為Fiber。比如Golang里的 go關鍵字其實就是負責開啟一個Fiber,讓func邏輯跑在上面。

    由于協(xié)程的暫停完全由程序控制,發(fā)生在用戶態(tài)上;而線程的阻塞狀態(tài)是由操作系統(tǒng)內核來進行切換,發(fā)生在內核態(tài)上。

    因此,協(xié)程的開銷遠遠小于線程的開銷,也就沒有了ContextSwitch上的開銷。

    協(xié)程和線程的比較

    比較項線程協(xié)程占用資源初始單位為1MB,固定不可變初始一般為 2KB,可隨需要而增大調度所屬由 OS 的內核完成由用戶完成切換開銷涉及模式切換(從用戶態(tài)切換到內核態(tài))、16個寄存器、PC、SP...等寄存器的刷新等只有三個寄存器的值修改 - PC / SP / DX.性能問題資源占用太高,頻繁創(chuàng)建銷毀會帶來嚴重的性能問題資源占用小,不會帶來嚴重的性能問題數(shù)據(jù)同步需要用鎖等機制確保數(shù)據(jù)的一直性和可見性不需要多線程的鎖機制,因為只有一個線程,也不存在同時寫變量沖突,在協(xié)程中控制共享資源不加鎖,只需要判斷狀態(tài)就好了,所以執(zhí)行效率比多線程高很多。

    關注我,后續(xù)更多干貨奉上!

    謝你的觀看~

    今天是我自學Java的第30天。

    你的觀看便是對我最大的鼓勵。?

    話不多說,開始今天的學習:

    很早的時候,就學習過死循環(huán)。

    現(xiàn)在思考一個問題,如何運行兩個死循環(huán)?

    用開發(fā)工具寫下代碼,會發(fā)現(xiàn)編譯會報錯:

    unreachable:不可能達到的。

    statement:語句。

    不可能達到的語句,為什么會這樣呢?

    其實很好理解,第一個while循環(huán)是死循環(huán),如果我們不強行將程序停止的話,它是會無止境的永遠運行下去的,那么第二個死循環(huán)語句根本就沒法運行到。

    所以開發(fā)工具會覺得你這條語句沒有意義從而報錯。

    那如何解決這個問題呢?

    就要引出我們今天的重點:線程。

    一、線程與進程

    線程,這個概念太重要的,據(jù)說面試基本都會問到和其相關的問題。

    提到線程往往會想到另一個概念:進程。

    什么叫進程呢?

    我們打開電腦任務管理器,就能看到進程。

    進程:指一個內存中運行的應用程序,一個應用程序可以同時運行多個進程。

    那什么又叫線程呢?

    線程:進程內部的一個獨立執(zhí)行單元,一個進程可以同時并發(fā)的運行多個線程。

    這種官方定義理解起來有點抽象,做個簡單的比喻:

    • 進程就相當于是火車;
    • 線程就相當于是車廂 。

    線程在進程下行進(車廂無法運行,它需要依賴火車)

    一個進程可以包含多個線程(一輛火車可以有多個車廂)

    線程消耗的資源比進程小的多(多個車廂比多列火車消耗資源少的多)

    明白了線程與進程,我們還要了解下電腦cpu它是如何工作的?下圖為一臺筆記本電腦的性能圖:

    這臺筆記本是:四核八線程,8邏輯處理器就是指8線程。

    意思就是說這臺筆記本電腦能在同一時間內同時執(zhí)行8個線程,就相當于這臺筆記本的cpu有8個人在幫它工作。

    這又要引出兩個概念:并行與并發(fā)。

    二、并行與并發(fā)

    • 并行:同一時刻,同時發(fā)生。
    • 并發(fā):同一時間段內發(fā)生,不是同時發(fā)生,但是因為完成的非常快速,看起來像是同時發(fā)生。

    所以上圖中,并行是8個,并發(fā)是3102個。

    并行8個

    因為電腦是四核八線程,有8個邏輯處理器,所以能同時執(zhí)行8個線程。

    并發(fā)3102個

    因為電腦當前有3102個線程要處理,cpu一次只能執(zhí)行8個線程,但是cpu太快太快了,它一個線程可能只要幾毫秒,就迅速切換到下一個,人眼根本就反應不過來,所以感覺同時在發(fā)生。

    并發(fā)并不是同時發(fā)生,而是CPU速度太快,感覺在同時發(fā)生。

    所以阿里巴巴為何這么牛?看看雙十一就知道了,雙十一0點那一秒光訂單量就有幾十萬,并發(fā)量是非常高的。

    在這種高并發(fā)的情況下能保證程序不崩是需要一定的技術的。

    我還記得周杰倫有次在QQ音樂發(fā)布專輯時,QQ音樂就崩了;最近好像網易云音樂也因為誰發(fā)布專輯崩了一次。就是因為并發(fā)量太高了,服務器處理不過來了。

    我們有的時候玩單機游戲會感覺到明顯的卡頓,單機游戲與網絡無關,它為什么有時候會卡呢?

    就是因為cpu“忙不過來了”,它還在處理其他的線程,單機游戲就沒來得及處理,便有了卡頓。

    所以面對這個問題有一個應急的土方法:

    將游戲的線程優(yōu)先級設置成最高,可以在一定程度上緩解卡頓。

    當然這種方法治標不治本,不能從根本上解決這個問題,想根本上解決還是得提高配置或者換電腦。

    因為CPU線程的調度是搶占式調度

    什么意思呢?

    就是CPU處理那個線程是隨機的,就算我將游戲的線程優(yōu)先級設置成最高,也沒法保證CPU一直都能處理它,還是會卡頓。

    三、Java里的線程

    Java中Java虛擬機也是搶占式調度。

    線程在Java里同樣也是一個類,Thread類,Thread就是線程的意思,在Java世界里,萬事萬物都可以是類……

    回到一開始的問題:如何運行兩個死循環(huán)?

    就可以使用線程:

    ①自定義線程:

    定義一個我們自己的線程,然后讓它繼承Java里的線程類Thread就好了。

    ②重寫run方法:

    在這里面就可以運行其中的一個死循環(huán)。

    ③main方法線程:

    main方法本身也是一個線程,也就是主線程。

    ④創(chuàng)建自定義線程對象:

    這不用多少,Java的特性面向對象,創(chuàng)建了對象,才好拿來直接使用。

    ⑤啟動我們自定義的線程:

    啟動的時候,就會直接調用自定義線程類中的run方法。

    現(xiàn)在加上主線程,一共就有兩個線程了。

    ⑥主線程中還可以執(zhí)行一個死循環(huán)

    這樣的話就可以運行兩個死循環(huán)了,就相當于有兩個人在同時工作。

    這就是線程的作用。

    總結

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有