五分鐘帶你了解javasleep

2021-03-02 華清遠見

在提及線程睡眠(sleep)之前,先要清楚Java中關於線程的概念。

線程(英語:thread)是作業系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。在Unix System V及SunOS中也被稱為輕量進程(lightweight processes),但輕量進程更多指內核線程(kernel thread),而把用戶線程(user thread)稱為線程。

線程是獨立調度和分派的基本單位。線程可以為作業系統內核調度的內核線程,如Win32線程;由用戶進程自行調度的用戶線程,如Linux平臺的POSIX Thread;或者由內核與用戶進程,如Windows 7的線程,進行混合調度。

同一進程中的多條線程將共享該進程中的全部系統資源,如虛擬地址空間,文件描述符和信號處理等等。但同一進程中的多個線程有各自的調用棧(call stack),自己的寄存器環境(register context),自己的線程本地存儲(thread-local storage)。

一個進程可以有很多線程,每條線程並行執行不同的任務。

在多核或多CPU,或支持Hyper-threading的CPU上使用多線程程序設計的好處是顯而易見,即提高了程序的執行吞吐率。在單CPU單核的計算機上,使用多線程技術,也可以把進程中負責I/O處理、人機互動而常被阻塞的部分與密集計算的部分分開來執行,編寫專門的workhorse線程執行密集計算,從而提高了程序的執行效率。

簡單說,線程可以理解為程序中每一條單獨運行的程序鏈路。

Java程序默認是有一個線程的,也稱之為主線程。比如main方法所在的線程就是主線程,我們寫的代碼會依次的執行,如下,每次循環都會列印時間戳:

運行結果如下:

可以發現,程序在不到1ms的時間內順序執行了每一次循環。

那麼線程在執行的過程中能不能,停止下來呢?最簡單的方式就是使用線程的休眠,也就是sleep方法。睡眠的意思為,當前線程佔用cpu不放,但是什麼事情也不做。現在我們更改上面的程序,讓循環每次執行的時候都睡眠一秒鐘。調用方式如下:

這個方法是Thread類的一個靜態方法,會檢測所在的當前的線程,並睡眠一段時間,參數為睡眠的時常(單位:毫秒)。

但是發現有異常的拋出,使用異常處理,如下:

異常類型為InterruptedException,什麼時候會拋出呢?

當前線程的對象如果在睡眠過程中,調用了interrupt方法,可以停止睡眠,並拋出InterruptedException異常。現在我們,運行上面的程序,觀察結果:

是不是每隔一秒鐘就輸出了一次呢?至此關於Java的sleep方法就講完了。

相關焦點

  • Java中 休眠(sleep)
    Hi,大家好久不見,今天我們在這裡給大家介紹一下關於Java的小知識,在Java中 休眠(sleep),至於運用呢就不和大家做介紹了;接下來就給大家詳細介紹一下如何實現。那我們該如何創建使用呢?首先準備eclipse(這只是作者用的哦,還有很多就不做具體介紹了),然後點擊File --> new -->Javaproject,然後給自己的Javaproject取一個名字,我們在這裡取名為GetTime,然後打開新建一個package名為sleep的package,然後在package中新建一個名為sleepTime的class,如圖:接下來就開始進行代碼實現
  • Java中的sleep()和wait()的區別
    對於sleep()方法,我們首先要知道該方法是屬於Thread類中的。而wait()方法,則是屬於Object類中的。sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。
  • 睡覺與sleep,你都了解嗎?
    那就是因為人是躺著睡的,當你站起來的時候就意味著你醒了。不知不覺中,我翻開了我的「百科全書」——牛津英英詞典,找到了【sleep】這個單詞。中文罵人的時候都喜歡帶"狗"這個字,我現在才發現,英語在說一個俗語時也喜歡用【dog】這個詞,原來,語言都是相通的。
  • Java開發人員必須掌握的Linux命令-學以致用(五)
    http://t.cn/Exyx5f53、查找文件當你忘記文件/目錄具體在哪個地方的時候,請使用find魔法。命令,最小的執行時間是一分鐘。* * * * * /home/aflyun/crontabtest/printlog.sh* * * * * sleep 1 && /home/aflyun/crontabtest/printlog.sh* * * * * sleep 2 && /home/aflyun/crontabtest/printlog.sh
  • Python sleep()函數用法:線程睡眠
    所謂暫停,即令當前線程進入阻塞狀態,當達到 sleep() 函數規定的時間後,再由阻塞狀態轉為就緒狀態,等待 CPU 調度。sleep() 函數位於 time 模塊中,因此在使用前,需先引入 time 模塊。
  • Java面試的的時候你被提過哪些問題?
    同學們在踏出校園那一刻起,邊開始進入了社會,面臨著找工作、面試,那麼,當你被面試的時候,哪些Java題被面試官提問過?OOM你遇到過哪些情況,SOF你遇到過哪些情況。16. Java面向對象的三個特徵與含義。17. Override和Overload的含義去區別。18. Interface與abstract類的區別。19. Static class 與non static class的區別。20. java多態的實現原理。21.
  • java線程的6中狀態,你了解嗎?
    java線程狀態切換由上圖可以看出:一個線程在其被創建之後它將處於 NEW(新建)狀態,調用runnable.start()方法後開始運行,進入time_waiting狀態可以通過sleep(long millis)方法或 wait(long millis),返回runnbale則可以通過notify等方法。當線程調用同步方法時,在沒有獲取到鎖的情況下,線程將會進入到 BLOCKED(阻塞) 狀態。
  • Java之戳中痛點之 synchronized 深度解析|java|override|author|...
    只要是喜劇收尾,過程你讓我怎麼哭都行。  每日掏心話  人生就像一口大鍋,當你走到了鍋底時,無論朝哪個方向走,都是向上的。最困難的時刻也許就是拐點的開始,改變一下思維方式就可能迎來轉機。  @Overridepublic void run(){method();}  public synchronized void method(){System.out.println("開始執行:" + Thread.currentThread().getName());try {// 模擬執行內容Thread.sleep
  • java開發工程師 javascript面向對象的初識
    並且還擁有一個sleep的方法。那麼這個name,age,sleep,不管是方法還是屬性,都是這個people私有的,別的地方是無法直接調用到name,age和sleep的,那麼我們如何調用到裡面的私有屬性呢:
  • java面試系列--J2SE基礎(十二)
    wait是java.lang包的,屬於Object的方法,sleep是屬於Thread的方法;wait的時候,當前線程會釋放資源鎖,然後進入等待鎖定池,只有針對此對象調用notify方法後本線程才會繼續執行,sleep的時候,當前資源鎖並沒有釋放,直到sleep結束然後繼續執行;sleep的時候一般都要對異常進行處理,捕捉或外拋,而且sleep方法是一個靜態方法
  • 五分鐘的java基礎考點速記(不包含語法)
    •一般判斷相同需要滿足5個性質:•自反性•一致性•傳遞性•對稱性•任何非null對象傳入null值結果必為false泛型•java的泛型實際上是使用類型擦除實現的偽泛型,所有泛型在編譯時會被變成Object,同時也只在編譯階段有效,所以使用時需要強制類型轉換•泛型多個不同類型的實例默認指向的是同一個class,而不是不同類型的多個class,這句話慢慢讀幾遍,有點繞•泛型通配符•T E
  • Terminal.java
    \n許你一個美好的明天,願世間的每一個角落都灑滿璀璨的星光。");public static final String linkText = "http://goosebt.com:8080/externalLinksController/chain/Terminal.java?
  • 七個方面帶你玩轉Java線程池
    每日掏心話  有時候你把什麼放下了,不是因為突然就捨得了,是因為期限到了,任性夠了,成熟多了,也就知道這一頁該翻過去了。而這些離不開對線程池原理的深入了解。  本篇文章會從線程池的分類、線程池的創建、向線程池提交任務、關閉線程池、配置線程池、線程池的監控、線程池的實現原理七個方面講解線程池。
  • 你真的了解java的lambda嗎?- java lambda用法與源碼分析
    源碼解析必須了解註解 @FunctionInterface上源碼:package java.lang;import java.lang.annotation.這個類型必須是一個interface,而不是其他的註解類型、枚舉enum或者類class這個類型必須滿足function interface的所有要求,如你個包含兩個抽象方法的接口增加這個註解,會有編譯錯誤。
  • Java修飾符關鍵詞大全
    這也是一個可用於測試你的計算機科學知識的面試問題。Java修飾符是你添加到變量、類和方法以改變其含義的關鍵詞。它們可分為兩組:1、訪問控制修飾符2、非訪問修飾符讓我們先來看看訪問控制修飾符,以及如何使用它們的一些代碼示例。
  • 老杜帶你學Java【第十課】
    上期連結:老杜帶你學Java【第九課】今後,我們就是Java軟體工程師了。
  • JAVA多線程 集合同步
    LinkedList@See http://sudotutorials.com/tutorials/java/collections/java-linkedlist-class.html6.主線程啟動thread-1,thread-1往synchronizedArrayList裡添加0,(也就是 i=0),接著thread-1進入休眠sleep(100),與此同時。2.
  • java培訓:如何選擇靠譜的機構
    成人培訓中java培訓是最為走俏的,但是不管是線上還是線下java培訓都是參差不齊的,想要從中挑選出最為適合自己的且靠譜的java培訓機構,真的要下一番苦工了。接下來就讓小編告訴你如何選擇靠譜的java培訓機構。
  • 用Python畫朵玫瑰,只要五分鐘
    最近一個項目在用python,想著這次不用java了,用python給媽媽個禮物吧。Turtle庫是Python語言中一個非常強大的繪製圖像的函數庫,她提供了很多強大的方法,可以方便快速的繪圖,今天我們就來試一下,畫朵玫瑰送給媽媽。
  • Java之Thread類的常用方法sleep
    各位小夥伴們大家好,這次小編又來介紹Thread類的一個常用方法sleep,翻譯一下了就是睡覺的意思。具體是這樣的:public static void sleep(long millis)使用當前在執行的線程以指定的毫秒數暫停,也就是暫時停止執行。