java多執行緒之執行緒狀態(2)
阿新 • • 發佈:2019-02-01
轉載請註明出處
http://blog.csdn.net/pony_maggie/article/details/43206445
作者:小馬
來看suspend和resume機制造成的阻塞現象。需要明確一點,suspend和resume在jdk1.6以後就不推薦使用了。這裡只為了說明原理。
Blockable和Peeker依然是通用測試類,新增了兩個類,分別為SuspendResume1和SuspendResume2。與上一篇類似,兩個類的唯一區別在於run函式:
class SuspendResume1 extends SuspendResume { public SuspendResume1(Container c) {super(c);} public synchronized void run() { while(true) { i++; update(); suspend(); } } } class SuspendResume2 extends SuspendResume { public SuspendResume2(Container c) { super(c); } public void run() { while(true) { change(); suspend(); } } public synchronized void change() { i++; update(); } }
這裡不多說了,執行的效果如下:
SuspendResume2中的value才會和文字框裡的計數器同步。
兩個類通過suspend來讓自己阻塞,從而其它執行緒才有機會執行,不過這裡有些區別,不像sleep在睡眠一定時間會自動喚醒,suspend的執行緒必須要resume才能喚醒,這就是Resumer類的作用,它也是一個執行緒,每隔1s就讓SuspendResume例項喚醒自己。
class Resumer extends Thread { private SuspendResume sr; public Resumer(SuspendResume sr) { this.sr = sr; start(); } public void run() { while(true) { try { sleep(1000); } catch (InterruptedException e) { // TODO: handle exception System.err.println("Interrupted"); } sr.resume(); } } }