線程的狀態---十九

/**
 * 1)線程的狀態
 *                        阻塞(sleep(),yiled(),jion())
 *                                        /         \
 *                                      /             \
 * (new)新生--(start())就緒-------運行-----死亡()
 * 2)停止線程(建議下面2中方式,溫柔不暴力)
 *   1、自然終止:線程體執行完畢,結束任務
 *   2、外部干涉
 *      a、定義flag屬性標識    b、線程體使用flag標識  c、對外提供改變flag屬性的方法
 * 3)線程阻塞
 *   1、join(合併線程)成員方法:t.join()方法阻塞調用此t成員方法jion的線程(calling thread),直到線程t完成,
 *           此線程再繼續;通常用於在main()主線程內,等待t線程完成再結束main()主線程。
 *           從這裏應該能猜的到,Thread類的jion方法是加鎖的,並且是個陷進,誰調用,誰在外面等。    
 *   2、yield靜態方法: 暫停自己的線程,讓出cpu調度,品格高尚!
 *   3、sleep靜態方法:休眠(睡覺),不釋放鎖 (抱着鎖睡),其他線程不能訪問,除非睡醒,結束線程。
 *      應用場景:a、倒計時    b、模擬網絡延時    
 */ 
public class StateThr {
public static void main(String[] args) throws InterruptedException {
FourThr fth=new FourThr("馬雲");  //新生
Thread proxy=new Thread(fth,"黃牛甲");
proxy.start();//就緒

//就緒後,等待cpu調度分配時間片---運行

Thread.sleep(5000);//放票時間5秒

fth.stop();//線程終止,死亡
}
}


class FourThr implements Runnable{
private int tickets=50;
private String name;
private boolean flag=true;

public FourThr(String name) {
this.name = name;
}
@Override
public void run() {//線程體
while(flag){
try {
task();
Thread.sleep(500);   //模擬延時時間,阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
private void task(){
if(tickets>0){
System.out.println(Thread.currentThread().getName()+",幫"+this.name+",搶到第"+(tickets--)+"張票");
}

}
public void stop(){
flag=false;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章