在提及線程睡眠(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方法就講完了。
华清图书馆
0元电子书,限时免费申领10本华清图书PDF版
扫码关注华清远见公众号