代碼分析Java中線程的等待與喚醒
我們先來看一下實例代碼:
class ThreadA extends Thread{
public ThreadA(String name) {
super(name);
}
public void run() {
synchronized (this) {
System.out.println(Thread.currentThread().getName()+" call notify()");
notify();
}
}
}
public class WaitTest {
public static void main(String[] args) {
ThreadA t1 = new ThreadA("t1");
synchronized(t1) {
try {
// 啟動“線程t1”
System.out.println(Thread.currentThread().getName()+" start t1");
t1.start();
// 主線程等待t1通過notify()喚醒。
System.out.println(Thread.currentThread().getName()+" wait()");
t1.wait();
System.out.println(Thread.currentThread().getName()+" continue");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
輸出結果:main start t1 -> main wait() -> t1 call notify() -> main continue
其實調用t1.start(),t1為就緒狀態(tài),只是main方法中,t1被main線程鎖住了,t1.wait()的時候,讓當前線程等待,其實是讓main線程等待了,然后釋放了t1鎖,t1線程執(zhí)行,打印t1 call notify(),然后喚醒main線程,最后結束;
這里說一下wait()與sleep()的區(qū)別,他們的共同點都是讓線程休眠,但是wait()會釋放對象同步鎖,而sleep()不會;下面的代碼t1結束之后才會運行t2;能夠證實這一點;
public class SleepLockTest{
private static Object obj = new Object();
public static void main(String[] args){
ThreadA t1 = new ThreadA("t1");
ThreadA t2 = new ThreadA("t2");
t1.start();
t2.start();
}
static class ThreadA extends Thread{
public ThreadA(String name){
super(name);
}
public void run(){
synchronized (obj) {
try {
for(int i=0; i <10; i++){
System.out.printf("%s: %d\n", this.getName(), i);
// i能被4整除時,休眠100毫秒
if (i%4 == 0)
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
相關文章
使用Java8?Stream流的skip?+?limit實現(xiàn)批處理的方法
Stream 作為 Java 8 的一大亮點,它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念這篇文章主要介紹了使用Java8?Stream流的skip?+?limit實現(xiàn)批處理,需要的朋友可以參考下2022-07-07
SpringBoot集成easy-rules規(guī)則引擎流程詳解
這篇文章主要介紹了SpringBoot集成easy-rules規(guī)則引擎流程,合理的使用規(guī)則引擎可以極大的減少代碼復雜度,提升代碼可維護性。業(yè)界知名的開源規(guī)則引擎有Drools,功能豐富,但也比較龐大2023-03-03
Springboot+Hutool自定義注解實現(xiàn)數(shù)據(jù)脫敏
我們在項目中會處理敏感數(shù)據(jù)時,通常需要對這些數(shù)據(jù)進行脫敏,本文主要使用了Springboot整合Hutool來自定義注解實現(xiàn)數(shù)據(jù)脫敏,感興趣的可以理解下2023-10-10
Java實現(xiàn)Map集合遍歷的四種常見方式與用法分析
這篇文章主要介紹了Java實現(xiàn)Map集合遍歷的四種常見方式與用法,結合實例形式較為詳細的分析了java針對Map集合鍵值對遍歷的常見使用技巧與相關操作注意事項,需要的朋友可以參考下2018-01-01
Spring MVC 自定義數(shù)據(jù)轉換器的思路案例詳解
本文通過兩個案例來介紹下Spring MVC 自定義數(shù)據(jù)轉換器的相關知識,每種方法通過實例圖文相結合給大家介紹的非常詳細,需要的朋友可以參考下2021-09-09

