Java線程休眠之sleep方法詳解
讓線程睡眠的sleep方法
Thread 類中有一個靜態(tài)方法的sleep方法,當該線程調(diào)用sleep方法后,就會暫時讓CPU的調(diào)度權(quán)。
但是監(jiān)視器資源比如鎖并不會釋放出去。在指定睡眠時間后,函數(shù)會正常返回。
如果線程在睡眠過程中如果如果調(diào)用了該線程的interrupt方法終端該線程,則會拋出sleep內(nèi)的InterruptedException異常而返回。
下面舉個例子,該線程在睡眠的擁有的監(jiān)視器并不會被釋放。
package com.example.demo.runnable.ChapterOne; import java.util.concurrent.locks.ReentrantLock; /** * @author 49800 */ public class SleepTest { private static final ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { Thread threadA = new Thread(() -> { lock.lock(); try { System.out.println("ThreadA 在執(zhí)行了"); Thread.sleep(10000); System.out.println("ThreadA 執(zhí)行完成了"); } catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } }); Thread threadB = new Thread(() -> { lock.lock(); try { System.out.println("ThreadB 在執(zhí)行了"); Thread.sleep(10000); System.out.println("ThreadB 執(zhí)行完成了"); } catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } }); threadA.start(); threadB.start(); System.out.println("Main 方法已經(jīng)在執(zhí)行了"); try { threadA.join(); threadB.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Main 方法已經(jīng)在執(zhí)行完成了"); } }
上面用到了獨占鎖,獨占鎖就是當一個線程在使用該鎖的時候,另一個線程必須等另一個線程釋放鎖后,下一個線程才能執(zhí)行。
這樣上面兩個線程就不會交叉執(zhí)行。從上面的執(zhí)行結(jié)果來看,當某一線程在在開始執(zhí)行后。
執(zhí)行到sleep方法,就暫停十秒才會打印執(zhí)行完成。因為調(diào)用了join的方法,所以必須這兩個線程執(zhí)行完成后才能執(zhí)行main方法。
在線程睡眠時,其他線程調(diào)用該線程的sleep方法,則會拋出異常。
package com.example.demo.runnable.ChapterOne; /** * @author 49800 */ public class SleepExceptionTest { public static void main(String[] args) { Thread thread = new Thread(() -> { try { System.out.println("開始執(zhí)行"); Thread.sleep(10000); System.out.println("執(zhí)行完畢"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread.start(); try { // Main 方法睡眠3s Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } thread.interrupt(); } }
結(jié)果:
子線程在睡眠期間,主線程中斷了他,所以在主線程在調(diào)用sleep方法后拋出了異常。
另外需要注意的事sleep(long millis)是毫秒值,當傳入的是一個負數(shù)的時候也是會拋出異常的。
到此這篇關于Java線程休眠之sleep方法詳解的文章就介紹到這了,更多相關Java線程休眠內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性詳解
在實際開發(fā)過程中,緩存的使用頻率是非常高的,只要使用緩存和數(shù)據(jù)庫存儲,就難免會出現(xiàn)雙寫時數(shù)據(jù)一致性的問題,本文主要介紹了如何保證緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性,需要的小伙伴可以參考閱讀2023-04-04JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法
這篇文章主要介紹了JVM優(yōu)先級線程池做任務隊列的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-08-08Java-Redis-Redisson分布式鎖的功能使用及實現(xiàn)
這篇文章主要介紹了Java-Redis-Redisson-分布式鎖的功能使用及實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法
這篇文章主要介紹了SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06