線程的狀態(tài)
線程分為五種狀態(tài)。
- 新建(new):當(dāng)我們創(chuàng)建線程的時候,線程出于new狀態(tài)腹泌。
- 可運(yùn)行狀態(tài)(runable):當(dāng)線程調(diào)用start()方法之后,線程出于可運(yùn)行狀態(tài)疮胖,等待cpu的時間片。
- 運(yùn)行狀態(tài)(running):當(dāng)線程獲得cpu時間片的時候誊役,線程出于運(yùn)行狀態(tài)获列。
- 堵塞狀態(tài)(blocked):堵塞狀態(tài)谷市,線程由于某種原因放棄了時間片蛔垢,只有重新獲得進(jìn)入runable狀態(tài)之后才有機(jī)會獲得時間片。堵塞狀態(tài)又分為三種:
等待堵塞:調(diào)用wait()方法迫悠,進(jìn)入等待隊(duì)列中鹏漆,調(diào)用notify()方法進(jìn)入runable狀態(tài)。
同步堵塞:線程出于running狀態(tài)创泄,當(dāng)無法獲得鎖時艺玲,會進(jìn)入同步隊(duì)列中。只有其他線程釋放鎖的時候喚醒同步隊(duì)列中的線程競爭獲得鎖進(jìn)入runable狀態(tài)鞠抑。
其他堵塞:當(dāng)線程調(diào)用sleep(),join(),或者發(fā)起IO請求的時候饭聚,當(dāng)sleep()或者join()超時返回runable狀態(tài)。 - 死亡(dead):線程執(zhí)行完搁拙,或者異常退出的時候秒梳。
java中的線程狀態(tài)
圖片來自https://blog.csdn.net/qq_22771739/article/details/82529874
線程終止
如何讓線程終止法绵,thread中提供了stop()方法,但是不建議用stop方法酪碘,因?yàn)閟top()會造成線程安全問題朋譬。
public class StopTest {
public static void main(String[] args) throws InterruptedException {
Stop stop = new Stop();
stop.start();
Thread.sleep(1000);
stop.stop();
stop.print();
}
}
class Stop extends Thread{
int i=0;
int j=0;
@Override
public void run() {
synchronized (this){
i++;
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
j++;
}
}
public void print(){
System.out.println("i="+i+"j="+j);
}
}
輸出
i=1j=0
原因是因?yàn)樵诰€程執(zhí)行到一部分的時候,線程被終止了并沒有保證原子性的執(zhí)行完方法兴垦。
用interrupt()方法終止線程徙赢,當(dāng)線程出于sleep(),wait(),join()狀態(tài)的時候,調(diào)用interrup()方法將會拋出InterruptedException探越,線程終止了狡赐,但是方法還是可以繼續(xù)執(zhí)行完的。
用狀態(tài)標(biāo)識控制線程狀態(tài)钦幔,我們也可以通過一個狀態(tài)標(biāo)識來控制線程是否終止阴汇,這一方法在jdk的源碼中有很多體現(xiàn)。