在java中,如果一個線程不想在特定的時間內執行任何操作,那麽我們應該使用sleep()方法,這會導致當前正在執行的線程停止指定的毫秒數。
用法:
public static native void sleep( long ms) throws InterruptedException ; // The above method put the thread in sleep for a specified number of millisecond
public static void sleep(long ms , int ns) throws InterruptedException // The above method also put the thread in sleep for a specified number of milliseconds // plus specified number of nanoseconds
方法一: TimeUnit sleep()
java中的每個sleep()方法都會拋出一個 InterruptedException,這是一個受檢查的異常,因此每當我們強製使用sleep方法時,我們應該通過try-catch或通過throws關鍵字來處理它,否則我們將得到編譯時錯誤。
執行:在這裏,我們讓主線程在“打印“ 陳述。所以每張幻燈片打印需要 5 秒。
示例
Java
// Java Program to illustrate sleep method
// Importing all input output classes
import java.io.*;
// Importing all utility classes from
// java.util package
import java.util.*;
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
throws InterruptedException
{
// Iterating using simple for loops
for (int i = 0; i <= 10; i++) {
// Printing the current thread slide
System.out.println("slide-" + i);
// Putting the main thread to sleep for 5 second
Thread.sleep(5000);
}
// Here after every 5 seconds a slide will be
// printed
}
}
輸出:
Note: Here slide-1 will be printed after slide-0 after 5000 nanoseconds so do apply for the rest of all the slides. Hence this output will be displayed taking a certain time in execution in the runtime state.
方法二:yield()方法
它會導致暫停當前正在執行的線程,以便為等待相同優先級的線程提供機會。如果沒有等待線程或所有等待線程的優先級都較低,則同一線程可以繼續執行。如果多個線程以相同的優先級等待,那麽哪個等待線程將獲得機會,我們不能說這取決於線程調度程序。線程何時再次獲得yield機會也取決於線程調度程序。
用法:
public static native void yield( );
執行:
示例
Java
// Java Program to illustrate yield() method
// Importing input output classes
import java.io.*;
// Importing all utility classes
import java.util.*;
// Class 1
// Helper class extending Thread class
// Creating a thread in our myThread class
// by extending the Thread class
class myThread extends Thread {
// Method in helper class
// Declaring run method
public void run()
{
// Displaying the message
System.out.println("Child Thread");
// Calling yield() method
Thread.yield();
}
}
// Class 2
// Main class
class GFG {
// Main driver method
public static void main(String[] args)
throws InterruptedException
{
// Creating a thread object in the main() method
// of our helper class above
myThread t = new myThread();
// Starting the above thread created
// using the start() method
t.start();
// Iterating using for loop
// over custom taken size equals 5
for (int i = 0; i < 5; i++) {
// Display message
System.out.println("Main Thread");
}
}
}
輸出說明:
在上麵的程序中,如果我們注釋該行線程.yield()兩個線程將同時執行,我們不能期望哪個線程先完成。如果我們不發表評論線程.yield()方法,因為主線程將獲得更多機會,並且首先完成主線程的機會很高。
至此,我們就完成了這兩種方法,最後總結一下它們之間的區別。
屬性 | 產量法 | 睡眠法 |
---|---|---|
Purpose | 如果一個線程想要暫停其執行,以便為具有相同優先級的剩餘線程提供機會,那麽我們應該使用yield 方法。 | 如果線程不想在特定時間內執行任何操作,那麽我們應該使用 sleep 方法 |
Over-loading | 該方法沒有重載 | sleep 方法超載。 |
Exception | 這個方法不會拋出異常 | 此方法會拋出中斷異常 |
本國的 | 這個方法是原生的 | 兩個重載方法中,隻有sleep(long ms)被重載,另一個沒有重載。 |
放棄顯示器 | 此方法放棄監視器。 | 此方法不會導致當前正在執行的線程放棄監視器。 |
相關用法
- Java stream.limit()用法及代碼示例
- Java streams counting()用法及代碼示例
- Java sqrt()用法及代碼示例
- Java signum()用法及代碼示例
- Java super()和this()的區別用法及代碼示例
- Java string轉boolean用法及代碼示例
- Java super和super()的區別用法及代碼示例
- Java String compareToIgnoreCase()用法及代碼示例
- Java String compareTo()用法及代碼示例
- Java String split()用法及代碼示例
- Java String length()用法及代碼示例
- Java String replace()用法及代碼示例
- Java String replaceAll()用法及代碼示例
- Java String substring()用法及代碼示例
- Java String equals()用法及代碼示例
- Java String equalsIgnoreCase()用法及代碼示例
- Java String contains()用法及代碼示例
- Java String indexOf()用法及代碼示例
- Java String trim()用法及代碼示例
- Java String charAt()用法及代碼示例
- Java String toLowerCase()用法及代碼示例
- Java String concat()用法及代碼示例
- Java String valueOf()用法及代碼示例
- Java String matches()用法及代碼示例
- Java String startsWith()用法及代碼示例
注:本文由純淨天空篩選整理自mroshanmishra0072大神的英文原創作品 Difference Between sleep and yield Method in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。