1. 程式人生 > 其它 >JAVA面向物件學習——java多執行緒———控制執行緒——執行緒睡眠:sleep()方法

JAVA面向物件學習——java多執行緒———控制執行緒——執行緒睡眠:sleep()方法

 

 

 

 

 

===========================================

 

 

執行緒睡眠:sleep

 

 

 

如果我們需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,則可以通過呼叫Thread類的靜態sleep方法,sleep方法有兩種過載的形式:

 

 

 

——static void sleep(long millis):讓當前正在執行的執行緒暫停millis毫秒,並進入阻塞狀態,該方法受到系統計時器和執行緒排程器的精度和準確度的影響。

 

 

——static void sleep(long millis, int nanos):讓當前正在執行的執行緒暫停millis毫秒加nanos毫微妙,並進入阻塞狀態,該方法受到系統計時器和執行緒排程器的精度和準確度的影響。

 

 

 

==============================================================

 

 

 

執行緒讓步

 

 

yield()方法是一個和sleep方法有點相似的方法,它也是一個Thread類提供的一個靜態方法,它也可以讓當前正在執行的執行緒暫停,但它不會阻塞該執行緒。

yield只是讓當前執行緒暫停一下,讓系統的執行緒排程器重新排程一次,完全可能的情況是:當某個執行緒呼叫了yield方法暫停之後,執行緒排程器又將其排程出來重新執行。

 

 

 

實際上,當某個執行緒呼叫了yield方法暫停之後,只有優先順序與當前執行緒相同,或者優先順序比當前執行緒更高的、就緒狀態的執行緒才會獲得執行的機會。

 

 

 

 

=================================================

 

 

 

sleep方法和yield方法的區別

 

 

 

sleep方法暫停當前執行緒後,會給其他執行緒執行機會,不會理會其他執行緒的優先順序。

但yield方法只會給優先順序相同,或優先順序更高的執行緒執行機會。

 

 

 

 

sleep方法會將執行緒轉入阻塞狀態,直到經過阻塞時間才會轉入就緒狀態。

而yield不會將執行緒轉入阻塞狀態,它只是強制當前執行緒進入就緒狀態。

因此完全有可能某個執行緒呼叫yield方法暫停之後,立即再次獲得處理器資源被執行。

 

 

 

 

sleep方法宣告丟擲了InterruptedException異常,所以呼叫sleep方法時要麼捕捉該異常,要麼顯式宣告丟擲該異常。

而yield方法則沒有宣告丟擲任何異常。

 

 

 

 

sleep方法比yield方法有更好的可移植性,通常不要依靠yield來控制併發執行緒的執行。

 

====================================================

 

如果需要讓當前正在執行的執行緒暫停一段時間,並進入阻塞狀態,則可以通過呼叫Thread類的靜態sleep()方法來實現。

 

關於sleep()方法和yield()方法的區別如下。

 

➢ sleep()方法暫停當前執行緒後,會給其他執行緒執行機會,不會理會其他執行緒的優先順序;但yield()方法只會給優先順序相同,或優先順序更高的執行緒執行機會。

 

➢ sleep()方法會將執行緒轉入阻塞狀態,直到經過阻塞時間才會轉入就緒狀態;而yield()不會將執行緒轉入阻塞狀態,它只是強制當前執行緒進入就緒狀態。

       因此完全有可能某個執行緒被yield()方法暫停之後,立即再次獲得處理器資源被執行。

 

➢ sleep()方法宣告丟擲了InterruptedException異常,所以呼叫sleep()方法時要麼捕捉該異常,要麼顯式宣告丟擲該異常;而yield()方法則沒有宣告丟擲任何異常。

 

➢ sleep()方法比yield()方法有更好的可移植性,通常不建議使用yield()方法來控制併發執行緒的執行。

 

 

 ==================================================================

 

 

 

 

public class SleepTest
{
	public static void main(String[] args)
		throws Exception
	{
		for (var i = 0; i < 10; i++)
		{
			System.out.println("當前時間: " + new Date());
			// 呼叫sleep方法讓當前執行緒暫停1s。
			Thread.sleep(1000);
		}
	}
}

  

 

 

 

 

 

public class SleepTest
{
	public static void main(String[] args)
		throws Exception
	{
		for (var i = 0; i < 10; i++)
		{
			System.out.println("當前時間: " + new Date());
			// 呼叫sleep方法讓當前執行緒暫停1s。
			Thread.sleep(1000);
		}
	}
}

  

 

 

 

 

 

下午 06:59:15: Executing task 'SleepTest.main()'...

> Task :compileJava
> Task :processResources NO-SOURCE
> Task :classes

> Task :SleepTest.main()

 

 

當前時間: Sun Mar 27 18:59:16 CST 2022
當前時間: Sun Mar 27 18:59:19 CST 2022
當前時間: Sun Mar 27 18:59:22 CST 2022
當前時間: Sun Mar 27 18:59:25 CST 2022
當前時間: Sun Mar 27 18:59:28 CST 2022
當前時間: Sun Mar 27 18:59:31 CST 2022
當前時間: Sun Mar 27 18:59:34 CST 2022
當前時間: Sun Mar 27 18:59:37 CST 2022
當前時間: Sun Mar 27 18:59:40 CST 2022
當前時間: Sun Mar 27 18:59:43 CST 2022

 

BUILD SUCCESSFUL in 31s
2 actionable tasks: 2 executed
下午 06:59:46: Task execution finished 'SleepTest.main()'.