当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。