1.線程和進(jìn)程的定義
- 線程:CPU調(diào)度的最小單位,不能獨(dú)立于進(jìn)程單獨(dú)存在
- 進(jìn)程:應(yīng)用在操作系統(tǒng)中運(yùn)行最小的分配單位
2.CPU核心數(shù)和線程數(shù)的關(guān)系

內(nèi)核數(shù)和線程的執(zhí)行個(gè)數(shù) 一對(duì)一的關(guān)系
邏輯處理器是intel做的虛擬化
3.CPU時(shí)間片輪轉(zhuǎn)機(jī)制
時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老、最簡(jiǎn)單、最公平且使用最廣的算法,又稱 RR 調(diào)度。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間。
- 上下文切換
切換執(zhí)行的進(jìn)程
4.并行和并發(fā)
- 并行(同一時(shí)刻)
指應(yīng)用能夠同時(shí)執(zhí)行不同的任務(wù),例:吃飯的時(shí)候可以邊吃飯邊打電話, 這兩件事情可以同時(shí)執(zhí)行 - 并發(fā)(同一時(shí)間單位)
指應(yīng)用能夠交替執(zhí)行不同的任務(wù),比如單 CPU 核心下執(zhí)行多線程并非是 同時(shí)執(zhí)行多個(gè)任務(wù),如果你開(kāi)兩個(gè)線程執(zhí)行,就是在你幾乎不可能察覺(jué)到的速度不斷去切換這兩個(gè)任務(wù),已達(dá)到"同時(shí)執(zhí)行效果",其實(shí)并不是的,只是計(jì)算機(jī)的速度太快,我們無(wú)法察覺(jué)到而已. - 兩者區(qū)別:一個(gè)是交替執(zhí)行,一個(gè)是同時(shí)執(zhí)行
5.高并發(fā)編程的意義、好處和注意事項(xiàng)
- 好處
充分利用 CPU 的資源
加快響應(yīng)用戶的時(shí)間
可以使你的代碼模塊化,異步化,簡(jiǎn)單化 - 注意事項(xiàng)
線程之間的安全性
線程之間的死鎖
線程太多了會(huì)將服務(wù)器資源耗盡形成死機(jī)當(dāng)機(jī)
6.Java 程序天生就是多線程的
- 一個(gè)最簡(jiǎn)單的main函數(shù)創(chuàng)建的所有線程
[6] Monitor Ctrl-Break //監(jiān)控 Ctrl-Break 中斷信號(hào)的
[5] Attach Listener //內(nèi)存 dump,線程 dump,類信息統(tǒng)計(jì),獲取系統(tǒng)屬性等 [4] Signal Dispatcher // 分發(fā)處理發(fā)送給 JVM 信號(hào)的線程
[3] Finalizer // 調(diào)用對(duì)象 finalize 方法的線程
[2] Reference Handler//清除 Reference 的線程
[1] main //main 線程,用戶程序入口
7.java新啟線程有幾種方式(兩種)
注意:在官方Thread類的代碼注釋中寫(xiě)明是兩種
- 類Thread
X extends Thread;,然后 X.start
- 接口Runnable
X implements Runnable;然后交給 Thread 運(yùn)行
- Thread 和 Runnable 的區(qū)別
Thread 才是 Java 里對(duì)線程的唯一抽象,Runnable 只是對(duì)任務(wù)(業(yè)務(wù)邏輯) 的抽象。Thread 可以接受任意一個(gè) Runnable 的實(shí)例并執(zhí)行。
8.線程終止
暫停、恢復(fù)和停止操作對(duì)應(yīng)在線程 Thread 的 API 就是 suspend()、resume() 和 stop()。但是這些 API 是過(guò)期的,也就是不建議使用的。
stop()方 法在終結(jié)一個(gè)線程時(shí)不會(huì)保證線程的資源正常釋放,通常是沒(méi)有給予線程完成資源釋放工作的機(jī)會(huì),因此會(huì)導(dǎo)致程序可能工作在不確定狀態(tài)下。
interrupt()方法:修改線程中斷標(biāo)識(shí)位
isInterrupted():判斷線程中斷標(biāo)識(shí)位
Thread.interrupted() :進(jìn)行判斷當(dāng)前線程是否被中斷,不過(guò) Thread.interrupted() 會(huì)同時(shí)將中斷標(biāo)識(shí)位改寫(xiě)為 false。
JDK中的 java里的線程是協(xié)作式的,不是搶占式的
Thread.currentThread().isInterrupted() //判斷當(dāng)前線程的標(biāo)識(shí)位
- 中斷異常在阻塞線程是對(duì)中斷標(biāo)識(shí)位的影響
中斷異常捕獲到異常時(shí)會(huì)修改中斷標(biāo)志位為false
9.對(duì) Java 里的線程再多一點(diǎn)點(diǎn)認(rèn)識(shí)
start 和 run方法的區(qū)別
start才是真正和線程產(chǎn)生關(guān)系,僅可以調(diào)用一次
run方法時(shí)業(yè)務(wù)邏輯實(shí)現(xiàn)的地方,run可以反復(fù)調(diào)用,可以脫離線程調(diào)用join方法(可以是線程的執(zhí)行變成串行)
把指定的線程加入到當(dāng)前線程,可以將兩個(gè)交替執(zhí)行的線程合并為順序執(zhí)行。 比如在線程 B 中調(diào)用了線程 A 的 Join()方法,直到線程 A 執(zhí)行完畢后,才會(huì)繼續(xù) 執(zhí)行線程 B。線程的優(yōu)先級(jí)(優(yōu)先級(jí)的范 圍從 1~10)
在不同的 JVM 以及操作系統(tǒng)上,線程規(guī)劃會(huì) 存在差異,有些操作系統(tǒng)甚至?xí)雎詫?duì)線程優(yōu)先級(jí)的設(shè)定守護(hù)線程
Daemon(守護(hù))線程是一種支持型線程,因?yàn)樗饕挥米鞒绦蛑泻笈_(tái)調(diào) 度以及支持性工作。這意味著,當(dāng)一個(gè) Java 虛擬機(jī)中不存在非 Daemon 線程的 時(shí)候,Java 虛擬機(jī)將會(huì)退出??梢酝ㄟ^(guò)調(diào)用 Thread.setDaemon(true)將線程設(shè)置 為 Daemon 線程。我們一般用不上,比如垃圾回收線程就是 Daemon 線程。
Daemon 線程被用作完成支持性工作,但是在 Java 虛擬機(jī)退出時(shí) Daemon 線 程中的 finally 塊并不一定會(huì)執(zhí)行。在構(gòu)建 Daemon 線程時(shí),不能依靠 finally 塊中 的內(nèi)容來(lái)確保執(zhí)行關(guān)閉或清理資源的邏輯。
10.synchronized 內(nèi)置鎖
- 用處與用法
同步塊
同步方法 - 對(duì)象鎖:對(duì)象鎖是用于對(duì)象實(shí)例方法
- 類鎖:類鎖是用于類的靜態(tài) 方法或者一個(gè)類的 class 對(duì)象上的