Java多線程 線程狀態(tài)原理詳解
這篇文章主要介紹了Java多線程 線程狀態(tài)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
java.lang.Thread.State枚舉定義了6種線程狀態(tài)。
- NEW: 尚未啟動(dòng)(start)的線程的線程狀態(tài)
- RUNNABLE: 運(yùn)行狀態(tài),但線程可能正在JVM中執(zhí)行,也可能在等待CPU調(diào)度
- BLOCKED: 線程阻塞,等待監(jiān)視器鎖以進(jìn)入同步代碼塊/方法
- WAITING: 等待狀態(tài)。使用以下不帶超時(shí)的方式時(shí)會(huì)進(jìn)入:Object.wait、Thread.join、LockSupport.park。等待狀態(tài)的線程需要另一個(gè)線程激活。
- TIMED_WAITING: 具有指定等待時(shí)間的等待狀態(tài),使用以下帶超時(shí)的方式:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil。
- TERMINATED: 終止?fàn)顟B(tài)。線程正常執(zhí)行完畢或者發(fā)生異常。
狀態(tài)切換
| 狀態(tài) | 條件 | 狀態(tài) | 條件 | 狀態(tài) |
|---|---|---|---|---|
| NEW | -(啟動(dòng))-》 | RUNNABLE | -(等待鎖)-》 | BLOCKED |
| RUNNABLE | 《-(拿到鎖)- | BLOCKED | ||
| RUNNABLE | -(等待其他線程通知)-》 | WAITING | ||
| RUNNABLE | 《-(收到其他線程通知)- | WAITING |
||
| RUNNABLE | -(有超時(shí)時(shí)間的,等待其他線程通知)-》 | TIMED_WAITING |
||
| RUNNABLE | 《-(收到其他線程通知,或者等待超時(shí))- | TIMED_WAITING |
||
| RUNNABLE | -(執(zhí)行結(jié)束)-》 | TERMINATED |
線程切換代碼示例
/**
* 多線程運(yùn)行狀態(tài)切換示例
*/
public class Demo2 {
public static void main(String[] args) throws Exception{
//第一種狀態(tài)切換 新建->運(yùn)行->終止
System.out.println("###第一種狀態(tài)切換 新建->運(yùn)行->終止###");
Thread thread1 = new Thread(()->{
System.out.println("thread1當(dāng)前狀態(tài):" + Thread.currentThread().getState());
System.out.println("thread1執(zhí)行完畢");
});
System.out.println("調(diào)用start之前,thread1當(dāng)前狀態(tài):" + thread1.getState());
thread1.start();
Thread.sleep(2000L); //等待thread1執(zhí)行結(jié)束
System.out.println("等待thread1執(zhí)行結(jié)束,當(dāng)前狀態(tài):" + thread1.getState());
System.out.println();
// thread1.start(); //此時(shí)會(huì)拋出java.lang.IllegalThreadStateException
//第二種狀態(tài)切換 新建->運(yùn)行->等待->運(yùn)行->終止
System.out.println("###第二種狀態(tài)切換 新建->運(yùn)行->等待->運(yùn)行->終止###");
Thread thread2 = new Thread(()->{
try {
Thread.sleep(1500L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread2當(dāng)前狀態(tài):" + Thread.currentThread().getState());
System.out.println("thread2執(zhí)行完畢");
});
System.out.println("調(diào)用start之前,thread2當(dāng)前狀態(tài):" + thread2.getState());
thread2.start();
System.out.println("調(diào)用start之后,thread2當(dāng)前狀態(tài):" + thread2.getState());
Thread.sleep(200L); //等待一段時(shí)間令thread2進(jìn)入sleep方法
System.out.println("調(diào)用start之后,等待200毫秒,thread2當(dāng)前狀態(tài):" + thread2.getState());
Thread.sleep(2000L); //等待thread2執(zhí)行結(jié)束
System.out.println("等待thread2執(zhí)行結(jié)束,當(dāng)前狀態(tài):" + thread2.getState());
System.out.println();
//第三種狀態(tài)切換 新建->運(yùn)行->阻塞->運(yùn)行->終止
System.out.println("###第三種狀態(tài)切換 新建->運(yùn)行->阻塞->運(yùn)行->終止###");
Thread thread3 = new Thread(()->{
synchronized (Demo2.class){
System.out.println("thread3當(dāng)前狀態(tài):" + Thread.currentThread().getState());
System.out.println("thread3執(zhí)行完畢");
}
});
synchronized (Demo2.class){
System.out.println("調(diào)用start之前,thread3當(dāng)前狀態(tài):" + thread3.getState());
thread3.start();
System.out.println("調(diào)用start之后,thread3當(dāng)前狀態(tài):" + thread3.getState());
Thread.sleep(200L);
System.out.println("等待200毫秒,thread3等待獲取鎖,thread3當(dāng)前狀態(tài):" + thread3.getState());
}
Thread.sleep(1000L); //等待thread3執(zhí)行完畢
System.out.println("等待1秒,令thread3獲取鎖后執(zhí)行方法,thread3當(dāng)前狀態(tài):" + thread3.getState());
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot配置文件綁定實(shí)現(xiàn)解析
這篇文章主要介紹了springboot配置文件綁定實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
Java語(yǔ)言的Comparable和Comparator區(qū)別
這篇文章主要介紹了Java語(yǔ)言的Comparable和Comparator區(qū)別,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
java讀取文件內(nèi)容的三種方法代碼片斷分享(java文件操作)
本文介紹java讀取文件內(nèi)容的三種方法,代碼可以直接放到程序中使用,大家參考使用吧2014-01-01
SpringBoot整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截的教程
我們寫(xiě)的任何一個(gè)項(xiàng)目,都應(yīng)該有安全防護(hù),不應(yīng)該讓這個(gè)項(xiàng)目進(jìn)行“裸奔”,否則很容易被別人進(jìn)行攻擊。而在SpringBoot環(huán)境中,其實(shí)可以很容易實(shí)現(xiàn)安全保護(hù),本文給大家介紹SpringBoot如何整合SpringSecurity實(shí)現(xiàn)認(rèn)證攔截,需要的朋友可以參考下2023-05-05

