1躬翁、RUNNABLE和BLOCKED的狀態(tài)轉(zhuǎn)換——線程等待synchrozied的隱式鎖。
線程調(diào)用阻塞式API時(shí),是否會(huì)轉(zhuǎn)換到BLOCKED狀態(tài)印颤?
在操作系統(tǒng)層面,線程是會(huì)轉(zhuǎn)換到休眠狀態(tài)穿肄,但是在JVM層面年局,java線程的狀態(tài)不會(huì)發(fā)生變化,也就是說java線程的狀態(tài)會(huì)依然保持RUNNABLE狀態(tài)咸产,JVM層面并不關(guān)心操作系統(tǒng)調(diào)度相關(guān)的狀態(tài)矢否,因?yàn)樵贘VM看來,等待CPU使用權(quán)(操作系統(tǒng)層面此時(shí)處于可執(zhí)行狀態(tài))與等待I/O(操作系統(tǒng)層面此時(shí)處于休眠狀態(tài))沒有區(qū)別脑溢,都是在等待某個(gè)資源僵朗,所以都?xì)w入了RUNNABLE狀態(tài)。
我們平時(shí)所謂的java在調(diào)用阻塞式API時(shí)屑彻,線程會(huì)阻塞验庙,指的是操作系統(tǒng)線程的狀態(tài),并不是java線程的狀態(tài)社牲。
2粪薛、RUNNABLE 與 WAITING 的狀態(tài)轉(zhuǎn)換
2.1、獲得synchrozied隱式鎖的線程膳沽,調(diào)用無參數(shù)的Object.wait()
2.2汗菜、Thread.join(),例如有一個(gè)線程對(duì)象A,當(dāng)調(diào)用A.join()的時(shí)候挑社,執(zhí)行這條語句的線程會(huì)等待threadA 執(zhí)行完陨界。
2.3、調(diào)用LockSupport.park()方法痛阻。
3菌瘪、RUNNABLE 與 TIMED_WAITING 的狀態(tài)轉(zhuǎn)移
WAITING基礎(chǔ)上加了超時(shí)參數(shù)