成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:說一下線程生命周期,以及轉換過程?

開發(fā) 后端
線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程,Java 線程的生命周期和上面說的生命周期是不同的,它有 6 種狀態(tài)。

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

轉載請聯(lián)系授權(微信ID:GG_Stone)

線程的生命周期指的是線程從創(chuàng)建到銷毀的整個過程,通常情況下線程的生命周期有以下 5 種:

  • 初始狀態(tài)
  • 可運行狀態(tài)
  • 運行狀態(tài)
  • 休眠狀態(tài)
  • 終止狀態(tài)

它們的狀態(tài)轉換如下圖所示:

Java 線程生命周期

Java 線程的生命周期和上面說的生命周期是不同的,它有以下 6 種狀態(tài):

  1. NEW(初始化狀態(tài))
  2. RUNNABLE(可運行/運行狀態(tài))
  3. BLOCKED(阻塞狀態(tài))
  4. WAITING(無時限等待狀態(tài))
  5. TIMED_WAITING(有時限等待狀態(tài))
  6. TERMINATED(終止狀態(tài))

我們可以在 Thread 的源碼中可以找到這 6 種狀態(tài),如下所示:

當然你也可以使用 Java 代碼,來打印所有的線程狀態(tài),如下代碼所示:

for (Thread.State value : Thread.State.values()) {
System.out.println(value);
}

以上程序的執(zhí)行結果如下圖所示:

生命周期轉換

接下來我們聊聊 Java 線程生命周期的轉換過程。

1.從 NEW 到 RUNNABLE

我們創(chuàng)建一個線程的時候,也就是 new Thread 的時候,此時線程是 NEW 狀態(tài),如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// ...
}
});
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
System.out.println(state);

以上程序的執(zhí)行結果如下圖所示:

然而調用了線程的 start 方法之后,線程的狀態(tài)就從 NEW 變成了 RUNNABLE,如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 獲取到當前執(zhí)行的線程
Thread currThread = Thread.currentThread();
// 獲取線程狀態(tài)
Thread.State state = currThread.getState();
// 打印線程狀態(tài)
System.out.println(state);
}
});
thread.start();

以上程序的執(zhí)行結果如下圖所示:

2.從 RUNNABLE 到 BLOCKED

當線程中的代碼排隊執(zhí)行 synchronized 時,線程就會從 RUNNABLE 狀態(tài)變?yōu)?BLOCKED 阻塞狀態(tài),如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
// 等待 100 毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("排隊使用鎖");
synchronized (ThreadStates.class) {
}
}
});
thread.start();
// 讓主線程先得到鎖
synchronized (ThreadStates.class) {
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 再次獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);
}

以上程序的執(zhí)行結果如下圖所示:

當線程獲取到 synchronized 鎖之后,就會從 BLOCKED 狀態(tài)轉變?yōu)?RUNNABLE 狀態(tài)。

3.從 RUNNABLE 到 WAITTING

線程調用 wait() 方法之后,就會從 RUNNABLE 狀態(tài)變?yōu)?WAITING 無時限等待狀態(tài),如下所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (this) {
try {
// 線程休眠
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

以上程序的執(zhí)行結果如下圖所示:

當調用了 notify/notifyAll 方法之后,線程會從 WAITING 狀態(tài)變成 RUNNABLE 狀態(tài),如下代碼所示:

Object lock = new Object();
// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
// 線程休眠
lock.wait();
// 獲取當前線程狀態(tài)
Thread.State state = Thread.currentThread().getState();
// 打印線程狀態(tài)
System.out.println("獲取線程狀態(tài):" + state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

// 喚醒 thread 線程
synchronized (lock) {
lock.notify();
}

以上程序的執(zhí)行結果如下圖所示:

4.從 RUNNABLE到TIMED_WATTING

當調用帶超時時間的等待方法時,如 sleep(xxx),線程會從 RUNNABLE 狀態(tài)變成 TIMED_WAITING 有時限狀態(tài),如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

以上程序的執(zhí)行結果如下圖所示:

當超過了超時時間之后,線程就會從 TIMED_WAITING 狀態(tài)變成 RUNNABLE 狀態(tài),實現代碼如下:


// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
// 獲取當前線程狀態(tài)
Thread.State state = Thread.currentThread().getState();
// 打印線程狀態(tài)
System.out.println("獲取線程狀態(tài):" + state);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 啟動線程
thread.start();
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("首次獲取線程狀態(tài):" + state);
// 休眠 1s
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取線程狀態(tài)
state = thread.getState();
// 打印線程狀態(tài)
System.out.println("第二次獲取線程狀態(tài):" + state);

以上程序的執(zhí)行結果如下圖所示:

5.RUNNABLE 到 TERMINATED

線程執(zhí)行完之后,就會從 RUNNABLE 狀態(tài)變成 TERMINATED 銷毀狀態(tài),如下代碼所示:

// 創(chuàng)建線程
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 獲取當前線程狀態(tài)
Thread.State state = Thread.currentThread().getState();
// 打印線程狀態(tài)
System.out.println("獲取線程狀態(tài):" + state);
}
});
// 啟動線程
thread.start();
// 等待 100ms,待線程執(zhí)行完
Thread.sleep(100);
// 獲取線程狀態(tài)
Thread.State state = thread.getState();
// 打印線程狀態(tài)
System.out.println("線程狀態(tài):" + state);

以上程序的執(zhí)行結果如下圖所示:

總結

Java 中線程的生命周期有 6 種:NEW(初始化狀態(tài))、RUNNABLE(可運行/運行狀態(tài))、BLOCKED(阻塞狀態(tài))、WAITING(無時限等待狀態(tài))、TIMED_WAITING(有時限等待狀態(tài))、TERMINATED(終止狀態(tài))。線程生命周期的轉換流程如下圖所示:

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-09-05 07:06:59

BeanSpring

2022-03-09 07:35:24

線程池線程參數

2022-06-06 15:33:20

線程Java釋放鎖

2022-06-29 11:01:05

MySQL事務隔離級別

2022-09-27 21:14:54

Spring事務傳播機制

2021-06-02 11:25:18

線程池Java代碼

2022-01-13 06:59:40

HashMap底層面試

2022-05-18 07:43:09

Exchange交換器JUC

2023-11-29 16:38:12

線程池阻塞隊列開發(fā)

2021-07-28 10:08:19

類加載代碼塊面試

2010-07-14 10:48:37

Perl線程

2009-06-18 13:32:39

Java線程生命周期

2022-07-20 07:29:55

TCPIP協(xié)議

2012-01-16 09:00:56

線程

2020-06-10 07:38:30

Spring框架周期

2009-06-29 18:03:15

Java多線程線程的生命周期

2010-07-14 10:59:15

Perl線程

2023-10-26 08:25:35

Java線程周期

2023-05-17 15:07:42

智能開發(fā)鴻蒙

2015-07-08 16:28:23

weak生命周期
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久一区二区三区 | 成人性视频免费网站 | 极品粉嫩国产48尤物在线播放 | 在线精品一区二区三区 | 一区二区在线观看免费视频 | 亚洲人的av| 日韩快播电影网 | 91新视频| www.久久久 | а_天堂中文最新版地址 | 国产成人网 | 91精品国产综合久久香蕉麻豆 | 日韩免费毛片视频 | 亚洲福利视频一区二区 | 久久99精品久久久久久秒播九色 | 久久国产亚洲精品 | 最新午夜综合福利视频 | 成人在线视频免费观看 | 国产资源在线播放 | 爱爱视频在线观看 | 久久国产精品精品 | 91天堂网| 日韩综合在线播放 | 午夜免费网站 | 久久国产精品视频免费看 | 欧美日韩久久 | 国产一区二区在线91 | 最近中文字幕第一页 | 日本视频在线播放 | 日韩成人影院在线观看 | 日韩免费网 | 久久无毛| 播放一级黄色片 | 久久久精品一区二区 | 91免费看片| 欧美日高清 | 伊人精品在线视频 | h视频在线播放 | 中文字幕亚洲精品在线观看 | 日韩一区二区三区视频 | 亚洲高清在线视频 |