物理CPU、核 和 線程之間的關系
物理CPU:是指硬件的核心數,指這台計算機有兩個CPU。
邏輯CPU:是邏輯上的,簡單理解為在邏輯上模擬出來的核心數,即效果是 物理1個CPU 模擬出邏輯CPU,上圖中是一個CPU模擬出兩個,相當於兩個CPU的效果。
CPU程數:是指在同一時刻設備能並行執行的線程數, 線程數=物理CPU * 邏輯CPU。即代表在此時此刻這個時間點,可以同時執行的線程數為4。
綜述所述,本台電腦為雙核4線程:內核2個,每個內核在模擬出2個邏輯處理器。
單核單線程: 在同一時刻運行一個線程。
單核雙線程: 在同一時刻運行2個線程。
雙核雙線程: 在同一時刻運行2個線程。
雙核多線程: 在同一時刻運行多個線程。
一個CPU線程只能在一個CPU上運行,一個CPU線程在同一時刻只能執行單一Java程序。
Java多線程並不是由於cpu線程數為多個才稱為多線程,當Java線程數 >(大於) cpu線程數,操作系統使用時間片機制,采用線程調度算法,頻繁的進行線程切換。多線程是程序設計的邏輯成概念,它是進程中並發運行的一段代碼,多線程實現線程之間的切換。
線程是操作系統最小的調度單位,進程是資源(比如:內存)分配的最小單位。
進程可能有多個子任務,比如微信要接受消息,發送消息,這些子任務就是線程。資源分配給進程,線程共享進程資源。
串行,並行 和 並發
串行:多個任務,一個任務執行完成后再執行另外一個,例如 吃完飯再看球賽。串行即線程同步。
並行:每個線程分配給獨立的核心,線程同時運行。例如 一邊吃飯一邊看球賽。常見於不同的線程中。
並發:多個線程在單個核心運行,同一時間一個線程運行,系統不停切換線程,看起來像同時運行,實際上是線程不停切換。例如 一會跑去食廳吃飯,一會跑去客廳看球賽。則並發即線程異步。
線程同步和線程異步之間的區別
同步:Sync,所謂同步,就是發出一個功能調用時,在沒有得到結果之前,該調用就不返回或繼續執行后續操作。
異步:Async,異步與同步相對,當一個異步過程調用發出后,調用者在沒有得到結果之前,就可以繼續執行后續操作。當這個調用完成后,一般通過狀態、通知和回調來通知調用者。對於異步調用,調用的返回並不受調用者控制。
根據定義,Java中所有方法都是同步調用,應為必須要等到結果后才會繼續執行。我們在說同步、異步的時候,一般而言是特指那些需要其他端協作或者需要一定時間完成的任務。
簡單來說,同步就是必須一件一件事做,等前一件做完了才能做下一件事。
舉個例子簡單說明下兩者的區別:
同步:火車站多個窗口賣火車票,假設A窗口當賣第288張時,在這個短暫的過程中,其他窗口都不能賣這張票,也不能繼續往下賣,必須這張票處理完其他窗口才能繼續賣票。直白點說就是當你看見程序里出現synchronized這個關鍵字,將任務鎖起來,當某個線程進來時,不能讓其他線程繼續進來,那就代表是同步了。
異步:當我們用手機下載某個視頻時,我們大多數人都不會一直等着這個視頻下載完,而是在下載的過程看看手機里的其他東西,比如用qq或者是微信聊聊天,這種的就是異步,你執行你的,我執行我的,互不干擾。比如上面賣火車票,如果多個窗口之間互不影響,我行我素,A窗口賣到第288張了,B窗口不管A窗口,自己也賣第288張票,那顯然會出錯了。
當java程序啟動線程異步時,程序會不停的創建新線程,會造成資源的浪費,一般會使用線程池來管理線程的數量。因此可簡稱異步線程池。
線程異步和多線程之間的關系
異步和多線程並不是一個同等關系,異步是最終目的,多線程只是我們實現異步的一種手段。異步是當一個調用請求發送給被調用者,而調用者不用等待其結果的返回而可以做其它的事情。實現異步可以采用多線程技術或則交給另外的進程來處理。即多線程實現異步調用
常見的異步實現框架 實例: 使用設計模式 “生產者和消費者”,這個鏈接更加詳細“生產者和消費者 設計模式實例”
線程池的概念
線程池的概念:“線程池_百度百科”
線程池:一個池中配置 固定個數目的 線程。即一個線程池中可以配置最多5個線程。
java並發編程即線程異步編程時使用線程池的概念。線程池底層實現詳解:“java並發編程:線程池的使用”
線程池應用實際案例訪問 https://www.cnblogs.com/iceworld520/p/7066388.html
多線程的異步執行方式,使用線程池 https://www.cnblogs.com/superfj/p/7544971.html