sleep(long millis)作用是讓當前執行緒休眠指定的毫秒,使當前執行緒進入阻塞狀態,期間會讓出cpu的資源,但不會釋放已獲得的鎖.
到達指定時間後,執行緒會從阻塞狀態變成 可執行狀態,重新競爭cpu的資源
static void sleep(long millis)
這是thread類中的靜態方法。這裡提到「當前執行緒」的概念,談談我的理解:
關於「當前執行緒」的理解:
即thread.currentthread()返回的執行緒,也可以說是正在執行sleep方法的執行緒。
下面來看個例子:
這裡建立並啟動了兩個執行緒,兩個執行緒都分別執行run方法裡的語句。當 thread-0 執行緒訪問run方法時,thread-0對於被訪問的run方法來說就是當前執行緒。當然,執行緒都是併發執行的,thread-1執行緒同時也在訪問run方法,那麼對於被thread-1訪問的run方法,thread-1就是當前執行緒。 所以,當前執行緒不能從字面上理解為某個時間段裡正在執行的執行緒,因為執行緒都是併發的,一段時間內有多個執行緒在同時執行。
現在來看看 sleep方法的例項:
public class mythread3 extends thread catch (interruptedexception e)
}public static void main(string args)
}
執行可以看到,「開始休眠」和「休眠結束」之間隔了2秒鐘,即 2000毫秒。
void interrupt();//像執行緒傳送中斷請求,執行緒的中斷狀態將被設定成true。如果目前該執行緒被乙個sleep呼叫堵塞,那麼,就會丟擲interruptedexception異常
static boolean interrupted() //測試當前執行緒是否被中斷,注意,這是乙個靜態的方法。而且這一呼叫會產生***:它會將當前的執行緒的中斷狀態重置為false。
boolean isinterrupted() //測試執行緒是否被中斷,這一呼叫不改變執行緒的中斷狀態
呼叫interrupt()方法後,執行緒中斷,該執行緒就不能繼續執行了。
來看下面這個例子:
暫時執行當前執行緒,並讓出cpu資源(不會釋放鎖).當前執行緒會進入等待列表,和等待列表中的其他執行緒重新一起競爭cpu的資源
所以執行yield方法的效果等價於當前執行緒把cpu時間片用完,從執行狀態返回到就緒狀態
public class mythread05 extends thread
long end = system.currenttimemillis();
long time=end-begin;
system.out.println(thread.currentthread().getname()+ "執行完畢,花費時間為"+ time);
}public static void main(string args) throws interruptedexception
}
執行結果如下:
耗費的時間很長,三個執行緒的執行耗費的時間差距也很大。(可以把for迴圈裡的 thread.yield() 刪除重新執行,執行結果差別很大)
暫停當前執行緒的執行,等待指定執行緒完成後在執行當前執行緒,執行起來的效果就好像是把指定執行緒合併到了當前執行緒.
void join(); 等待該執行緒終止
void join(long millis);等待該執行緒終止,等待的時間最長為 millis 毫秒。
注意點:- join方法可以傳入乙個引數,如 在a執行緒中呼叫 b.join(10),表示a執行緒會等待b執行緒10ms後執行,10ms後,a、b執行緒並行執行.join()等價於join(0),表示a執行緒等待b執行緒無限時間,直到b執行緒執行結束
- a執行緒呼叫 b.join()後,在b執行緒執行過程中,如果a執行緒傳送了中斷會丟擲異樣(但如果b中斷不會報異常)
- join內部實現是呼叫wait()方法實現,所以呼叫join方法會釋放鎖
例子: 要求建立 a,b,c三個執行緒,並規定讓 執行緒a,執行緒b,執行緒c順序執行完成
public class mythread5 extends thread catch (interruptedexception e)
}public static void main(string args) throws interruptedexception catch (interruptedexception e)
});thread c = new thread(()-> catch (interruptedexception e)
});a.start();
b.start();
c.start();;}}
java多執行緒 二 執行緒的互斥
多執行緒相對於單執行緒而言,大大的提高了硬體cpu的使用率,提高了處理的速度。任何事物帶來的都是兩面性的,多執行緒為我們帶來效能提高的同時也帶來了許多的安全性問題。說互斥之前,先說一下什麼是互斥,舉個列子,一天去atm機取錢,如果沒有互斥的話,你正取著錢突然有個人衝進來把你的錢搶走了。這時候你想,要...
Java多執行緒系列(二) 執行緒安全
個人主頁 tuzhenyu s page 多執行緒併發操作下可能出現記憶體不可見問題,指令重排序問題,4位元組賦值問題等,主要造成執行緒不安全的還是記憶體不可見和指令重排序 非執行緒安全出現的情況主要是多執行緒同時對乙個共享可變變數進行讀寫操作,因此可以通過以下三種方法解決非執行緒安全問題 將可變變...
JAVA學習筆記 多執行緒(二)執行緒常用方法
thread類包含的方法 start 啟動執行緒 isalive 判斷執行緒當前是否正在執行 setpriority 設定優先順序 jion 使乙個執行緒等待另乙個執行緒結束 sleep mills long 指定執行緒休眠指定毫秒 yield 使執行緒暫停並允許執行其他程序 wait 和notif...