在提及線程睡眠(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方法就講完了。