java 多線程基礎(二)

  1. 什麼是線程?
    操做系統是包含多個進程的容器,而每一個進程又是容納了多個線程的容器。
    在這裏插入圖片描述
    從圖中能夠看出 一個操做系統同時能夠有多個子進程,一個進程能夠有多個子線程但一個子線程只能有一個父進程。

建立你的第一個java多線程程序:html

public class Creat100Threads {

    /** * 建立一百個線程 * @param args */
    public static void main(String[] args) throws InterruptedException {
        for(int i=0;i<100;i++){
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(10000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
}

在這裏插入圖片描述
運行代碼後 多了100個線程 能夠看到 程序確實實現了線程。java

線程和進程的不一樣

  • .進程和線程的定義不一樣
    • 進程:是執行中一段程序,即一旦程序被載入到內存中並準備執行,它就是一個進程。進程是表示資源分配的的基本概念,又是調度運行的基本單位,是系統中的併發執行的單位。
    • 線程:單個進程中執行中每一個任務就是一個線程。線程是進程中執行運算的最小單位,是cpu調度的基本單位。
  • 內存共享方式不一樣:
    • 進程是相互獨立的:不一樣進程會被操做系統分配必定內存空間,但一般不一樣進程之間內存是獨立的沒法互相訪問。若是要實現進程間通信須要用到"進程間通訊(IPC)"。
    • 線程之間特定資源是共享的:線程共享資源包括:
    1. 進程代碼段
    2. 進程的公有數據(利用這些共享數據,線程很容易實現相互通信)
    3. 進程打開文件掃描符
    4. 信號處理器
    5. 進程的當前目錄
    6. 進程用戶ID與進程組ID
    • 線程獨有內容:
    1. 線程ID
    2. 寄存器組的值
    3. 線程的堆棧
    4. 錯誤返回碼
    5. 線程的屏蔽新號碼
  • 數量不一樣
    • 一個進程至少有一個或以上線程, 一個線程只能有一個父進程。
  • 開銷不一樣
    1. 線程的建立、終止時間比進程段
    2. 同一進程內的線程切換時間比進程短
    3. 同 一進程的各個線程間共享內存和文件資源,可不經過內核進行通訊。

Java語言和多線程的淵源和關係

  • Java設計之初–支持多線程(受限於硬件當時不少語言並不支持多線程)
  • Java語言在服務端開發語言中的地位–常年居榜前三(阿里 騰訊 百度 美團。。。)
  • 一對一映射到操做系統的內核線程(java中的多線程會在操做系統內核 中一一對應創建多線程)
  • jvm自動啓動線程
    在這裏插入圖片描述
    啓動一個只有main方法的java程序能夠看到除了main線程還jvm還幫咱們啓動了其餘線程,這裏面啓動的線程有
    Finalizer:負責對象的Finalizer()方法
    Signal Dispatcher 負責把操做系統發來的信號分發給適當的程序處理
    Reference Handler GC、引用相關線程(java的垃圾回收)
    main 主線程,用戶程序的入口。

多線程

什麼是多線程?

多線程的概念:若是一個程序容許兩個或以上的線程,那麼它就是多線程程序。多線程市值在單個進程中運行多個線程。程序員

生活中的多線程:

比喻你和室友同住一間房web

  • 客廳(進程的內存空間)
  • 廁所(只能有一我的上廁所 上廁所時其餘人不能上 鎖的概念)
  • 獨立房間(每一個線程 有本身的ID 堆棧)
  • 打掃(一我的打掃效率比較慢 在公共區域可能會一塊兒協做打掃 )
  • 吃火鍋
    • 大火鍋一人吃(至關於 單進程單線程)
    • 大火鍋一塊兒吃 (單進程 多線程)
    • 一我的吃多個小火鍋(多進程)
    • 吃火鍋底料(有人霸佔了這些火鍋(鎖) 那你就吃不到了)

什麼是多線程?

多線程實際例子:搶火車票
在這裏插入圖片描述
若是各個任務相互獨立 互不影響 則不須要多線程。
在這裏插入圖片描述
但絕大多數場景不一樣的任務 是相互耦合影響的,這時候就須要多線程。編程

爲何須要多線程?

  • 最主要是提升cpu利用效率
    -cpu一個時鐘週期 是很是快的 相對於內存 和 硬盤來講 是跟不上 cpu這個速度的 若是 爲了響應 cpu 內存 的處理的數據 那會大大拖累cpu的性能。那cpu在這個等到內存 等外部設備處理的、過程當中就會浪費資源。而多線程就是提升cpu的資源利用率。
  • 提升用戶體驗:避免卡頓、縮短等待時間
    • 並行處理,提升性能,一般是服務領域(例如timcat),用多個線程去接收進來的Http請求,而不是排隊等待單一的線程處理。
    • 在Android開發中,主線程的重要任務之一是繪製屏幕界面,該線程中不容許進行IO操做或網絡請求,目的是避免卡頓,影響用戶交互。
  • 便於程序員設計編程模型(將一個功能分割成若干不一樣子線程)
  • 阿姆達定律
    -處理器越多,程序就執行越快,但有上限,取決於程序中串行部分的比例,並行比例越高多處理器性能優點越明顯。
    在這裏插入圖片描述
    因爲摩爾定律的逐漸失效 單主頻提高愈來愈不明顯,要想提高程序速度 須要靠程序提升並行處理的能力。

什麼場景會用到多線程?

  • 同時處理不一樣的事:1. 聽音樂 2. 後臺定時任務,execel
  • 同時提升工做效率:1. tomecat 2. 並行下載 3. NIO
  • 須要很大併發量的時候

多線程的侷限

  • 性能問題:上下文切換帶來的問題
  • 異構化任務: (任務結構不同)很難高效並行
  • 帶來線程安全問題:包括數據安全問題(例如i++ 總數不一致) 以及線程帶來的活躍性問題(線程飢餓、死鎖)

串行、並行、併發

  • 串行和並行
    在這裏插入圖片描述
    打個比方 串行就是你數羊毛一次數1根1根的 而並行 是十根十根一塊兒數。
  • 並行、併發
    在這裏插入圖片描述
    在只有一個cpu的狀況下 可是 你的音樂 QQ 都能 同時運行 互相切換 就是cpu處於並行運算 將cpu的片斷是在不一樣進程中切換分配的。這時cpu至關於在邏輯上並行處理多個應用。
    而當有多個cpu時 程序跑在真實的不一樣物理cpu上這時就是併發了。
    在這裏插入圖片描述
  • 真正的"同時"運行-在同一時刻,有多個任務同時執行。
    例如,在多核處理器上,有兩個線程同時執行一段代碼。
    相反的,單核cpu是沒法處理併發任務的。

併發的2種概念

  1. 形容多個任務的執行狀態
    • 兩個或多個任務能夠再重疊的時間段內啓動,運行和完成
    • 併發(兩個線程同時執行)必定是併發
      p a r a l l e l i s m C o n c u r r e n c y parallelism \in Concurrency
      能夠說:併發是並行的充分條件,並行是併發的必要條件。
      在這裏插入圖片描述
  2. 對"併發性"的簡稱
    • 不一樣部分能夠無序或同時執行,且並不會影響最終的執行結果。
    • 在不一樣核心數的計算機上的不一樣表現

串並行和併發的實際例子

  • 打遊戲時,女友來電話
    假設 大腦是單核cpu
    並行:此時 若是你選擇繼續打遊戲而且 接電話 但受限於你的大腦是單核的 你的思惟就只能在這之間不一樣切換,此時就是並行。
    串行:此時你選擇暫時不接電話,等遊戲結束後 再打電話給女友 ,此時就是串行,每次只處理一件事。
    一個程序能並行運行必定具備併發性。

是什麼讓併發和並行成爲可能?

  • CPU升級
  • 操做系統升級
  • 編程語言升級

高併發

  • 什麼是高併發(雙十一 春晚 12306)
    • 是系統 同時可以處理大量的不求請求的能力。
  • 高併發和多線程的聯繫和不一樣?
    • 多線程是高併發的一種重要的解決方案,多線程並不意味着高併發,如Redis 是單線程的同時也是能處理大量的請求。
  • 高併發有哪些指標
    -QPS(Queries Per Second) 每秒的查詢數
    • 帶寬
    • PV(Page View)
    • UV(Unique Visitor)
    • IP 和 UV 的區別
    • 併發鏈接數(The number of concurrency)
    • 服務器平均請求等待時間 (Time per request:across all concurrent requests)

同步與異步、阻塞與非阻塞

  • 同步與異步:被調用者主動告訴調用者結果
  • 阻塞與非阻塞:我是調用者,我調用一個東西之後,結果返回前,是否還能處理其餘事情。

在這裏插入圖片描述
如上圖 在EVENT調用後 有一段等待時間 電腦是不會作其餘事情的 直到結果返回前,此時電腦資源被白白的耗費着。安全

在這裏插入圖片描述
異步就不一樣了在發送一個請求後在服務器響應前 電腦又去處理其餘請求了。 就至關於你燒白開水 同步的話你就守在水壺面前什麼也不幹 直到水壺燒開 開關跳掉 但我相信平時你坑定不會這麼作 更多的是異步 燒開水時你去幹別的事等 燒開 等電源跳掉 你聽到了 再去取。
在這裏插入圖片描述服務器

同步:同步異步這裏指的是被調用者(也就是服務器)的行爲,而不是請求方的行爲。在沒有獲得結果這錢,服務端就不返回任何結果。
異步:調用在發出以後,服務端馬上返回,告訴調用方」我收到你的請求了,我會處理的「。
再打個比方 你去借書 問老闆有沒有這本書老闆說 我幫你找找 而後過了一小時你就去問老闆 書有沒有找到 這時同步的一種思想 與此相對的是 當你去問老闆的時候老闆說 我先幫你找找 你留個電話找到了我再打電話給你這就至關於異步 回調了你的電話。網絡

阻塞和非阻塞

  • 站在線程狀態的角度
  • 站在線程發出請求(一般是HTTP請求)的角度
  • 阻塞非阻塞的栗子:燒水壺、買書 仍是借書的栗子 若是在你問了老闆以後 你若是去幹了別的事情那這就是非阻塞。固然若是你一直等着老闆 那就是阻塞。 燒開水 一樣也是 你能夠在燒燬的同時去看電視 等到 水壺發出 嗚嗚嗚的聲音你再處理。這樣就是異步非阻塞。若是你一直等着 可是等聽到水壺發出嗚嗚嗚 的聲音 你再去處理 這就是 異步阻塞 所謂的異步就是讓被調用者 主動觸發 調用者 來實現而同步與此相反 就是水壺不會發出 嗚嗚嗚 的聲音你必須時不時的去看 這水壺燒開沒有 。
相關文章
相關標籤/搜索