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