當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Java sleep和yield的區別用法及代碼示例


在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)被重載,另一個沒有重載。
放棄顯示器 此方法放棄監視器。 此方法不會導致當前正在執行的線程放棄監視器。


相關用法


注:本文由純淨天空篩選整理自mroshanmishra0072大神的英文原創作品 Difference Between sleep and yield Method in Java。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。