电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

淺談JAVA 線程狀態中可能存在的一些誤區

瀏覽:99日期:2022-08-14 13:37:13
BLOCKED 和 WAITING 的區別

BLOCKED 和 WAITING 兩種狀態從結果上來看,都是線程暫停,不會占用 CPU 資源,不過還是有一些區別的

BLOCKED

等待 Monitor 鎖的阻塞線程的線程狀態,處于阻塞狀態的線程正在等待 Monitor 鎖進入 synchronized Block 或者 Method ,或者在調用 Object.wait 后重新進入同步塊/方法。簡單的說,就是線程等待 synchronized 形式的鎖時的狀態

下面這段代碼中, t1 在等待 t0 的鎖釋放(synchronized代碼塊執行完成),那么此時 t1 的狀態就是 BLOCKED

Object lock = new Object();Thread t0 = new Thread(new Runnable() { @Override public void run() {synchronized (lock){ System.out.println('t0 acquire lock success'); try {Thread.sleep(10000); } catch (InterruptedException e) {e.printStackTrace(); }} }});t0.start();Thread.sleep(100);Thread t1 = new Thread(new Runnable() { @Override public void run() {synchronized (lock){ System.out.println('t1 acquire lock success');} }});t1.start();Thread.sleep(100);System.out.println('t0 state: '+t0.getState());System.out.println('t1 state: '+t1.getState());System.out.println('done.');//outputt0 acquire lock successt0 state: TIMED_WAITINGt1 state: BLOCKEDdone.t1 acquire lock successWAITING

等待中的線程狀態,下面幾個方法的調用會導致線程進入 WAITING 狀態:

Object.wait() Thread.join() LockSupport.park()

WAITING 狀態中的線程在等待其他線程執行某些操作,比如在某個對象上調用 Object.wait() 的線程正在等待另一個線程在該對象上調用 Object.notify() 或 Object.notifyAll()。為 Thread.join() 的線程正在等待指定的線程停止。下面這段代碼中,t0 在通過 synchronized 獲取了 lock 對象的鎖之后,進行了 wait 操作,導致 t0 進入 WAITING 狀態:

Object lock = new Object();Thread t0 = new Thread(new Runnable() { @Override public void run() {synchronized (lock){ System.out.println('t0 acquire lock success'); try {lock.wait(); } catch (InterruptedException e) {e.printStackTrace(); }} }});t0.start();Thread.sleep(100);System.out.println('t0 state: '+t0.getState());System.out.println('done.');//outputt0 acquire lock successt0 state: WAITINGdone.區別

JAVA 中除了 synchronized Block/Method 的鎖,還提供了 JUC 下的鎖實現, juc.lock 下的鎖功能更強大。比如支持中斷,支持重入/非重入,公平/非公平等;但是 juc 下的鎖和 synchronized 的實現可是不太一樣的比如下面這段代碼,同樣是等待鎖,可是和synchronized等待鎖的狀態還不一樣:

ReentrantLock reentrantLock = new ReentrantLock();Thread t0 = new Thread(new Runnable() { @Override public void run() {reentrantLock.lock();System.out.println('t0 acquire lock success');try { Thread.sleep(10000);} catch (InterruptedException e) { e.printStackTrace();} }});t0.start();Thread.sleep(100);Thread t1 = new Thread(new Runnable() { @Override public void run() {reentrantLock.lock();System.out.println('t1 acquire lock success'); }});t1.start();Thread.sleep(100);System.out.println('t0 state: '+t0.getState());System.out.println('t1 state: '+t1.getState());System.out.println('done.');//outputt0 acquire lock successt0 state: TIMED_WAITINGt1 state: WAITINGdone.

同樣是加鎖,在 JUC 的鎖實現下線程狀態不太一樣,所以在觀察線程狀態時,不止是 BLOCKED 的狀態才是等待鎖, WAITING/TIMEWAITING 的狀態仍然可能是等待鎖的狀態不過 JUC 下的鎖實現,讓線程暫停/等待的核心方法還是 LockSupport.park , jstack 對于 PARKING 形式的 WAITING 會有標注,所以在線程 stack 時還是能一眼看出來的:

//這里顯示了等待類型'Thread-0' #11 prio=5 os_prio=31 tid=0x00007f9308110000 nid=0x5c03 waiting on condition [0x0000700007fc3000] java.lang.Thread.State: WAITING (parking)//這里雖然是WAITING,但還是標注了是parking類型的at sun.misc.Unsafe.park(Native Method)

而 synchronized 形式的鎖在 jstack 下的輸出會有所區別:

//這里顯示了等待類型為monitor'Thread-1' #12 prio=5 os_prio=31 tid=0x00007f833d919800 nid=0x5a03 waiting for monitor entry [0x00007000035af000] java.lang.Thread.State: BLOCKED (on object monitor)//這里是BLOCKED狀態,同時顯示了monitor的歸屬

所以在觀察線程狀態時,需要注意Object.wait()這種WAITING和juc下鎖導致的WAITING的區別

RUNNABLE 真的是 RUNNABLE 嗎?

下面是一段 jstack 輸出的例子,該線程現在正在執行 socketRead0 方法(Native),并且是 RUNNABLE 狀態

'RMI TCP Connection(2)-192.xxx.xx.xx' daemon prio=6 tid=0x000000000a3e8800 nid=0x158e50 runnable [0x000000000adbe000]java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(Unknown Source)at java.net.SocketInputStream.read(Unknown Source)at java.io.BufferedInputStream.fill(Unknown Source)at java.io.BufferedInputStream.read(Unknown Source)- locked (0x00000007ad784010) (a java.io.BufferedInputStream)at java.io.FilterInputStream.read(Unknown Source)at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source)at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)at java.lang.Thread.run(Unknown Source)

但其實這里的 RUNNABLE 只是 JAVA 層面的線程狀態,在操作系統或進程角度來看,該線程還是 WAITING 的狀態; SocketInputStream 是一個 BIO 的實現,當沒有收到數據(或者說沒有準備好可讀的數據)時會發生阻塞,可這個阻塞在JAVA線程狀態里是 RUNNABLE 的狀態,不過他并不會占用用戶態的 CPU 時間片,內核在接受到數據后會結束這個阻塞

參考

https://blog.fastthread.io/2018/09/02/threads-stuck-in-java-net-socketinputstream-socketread0/

到此這篇關于淺談JAVA 線程狀態中可能存在的一些誤區的文章就介紹到這了,更多相關JAVA 線程狀態內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
主站蜘蛛池模板: 市政路灯_厂家-淄博信达电力科技有限公司 | 世界箱包品牌十大排名,女包小众轻奢品牌推荐200元左右,男包十大奢侈品牌排行榜双肩,学生拉杆箱什么品牌好质量好 - Gouwu3.com | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 武汉高低温试验箱_恒温恒湿试验箱厂家-武汉蓝锐环境科技有限公司 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 打孔器,打孔钳厂家【温州新星德牌五金工具】 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 济南ISO9000认证咨询代理公司,ISO9001认证,CMA实验室认证,ISO/TS16949认证,服务体系认证,资产管理体系认证,SC食品生产许可证- 济南创远企业管理咨询有限公司 郑州电线电缆厂家-防火|低压|低烟无卤电缆-河南明星电缆 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 合肥角钢_合肥槽钢_安徽镀锌管厂家-昆瑟商贸有限公司 | 首页-浙江橙树网络技术有限公司 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 安规电容|薄膜电容|陶瓷电容|智旭JEC安规电容厂家 | 骨密度仪-骨密度测定仪-超声骨密度仪-骨龄测定仪-天津开发区圣鸿医疗器械有限公司 | 贝壳粉涂料-内墙腻子-外墙腻子-山东巨野七彩贝壳漆业中心 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 转向助力泵/水泵/发电机皮带轮生产厂家-锦州华一精工有限公司 | 丙烷/液氧/液氮气化器,丙烷/液氧/液氮汽化器-无锡舍勒能源科技有限公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 上海风淋室_上海风淋室厂家_上海风淋室价格_上海伯淋 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 电动手术床,医用护理床,led手术无影灯-曲阜明辉医疗设备有限公司 | 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 中山东港家具集团-酒店-办公-医养家具定制厂家 | 海外整合营销-独立站营销-社交媒体运营_广州甲壳虫跨境网络服务 焊管生产线_焊管机组_轧辊模具_焊管设备_焊管设备厂家_石家庄翔昱机械 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 深圳富泰鑫五金_五金冲压件加工_五金配件加工_精密零件加工厂 | 众品地板网-地板品牌招商_地板装修设计_地板门户的首选网络媒体。 | 冷却塔风机厂家_静音冷却塔风机_冷却塔电机维修更换维修-广东特菱节能空调设备有限公司 | 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 | 优宝-汽车润滑脂-轴承润滑脂-高温齿轮润滑油脂厂家 | 长沙印刷厂-包装印刷-画册印刷厂家-湖南省日大彩色印务有限公司 青州搬家公司电话_青州搬家公司哪家好「鸿喜」青州搬家 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 |