在java中,如果一个线程在特定的时间内不想执行任何操作,那么应该使用sleep()方法,它可以使当前执行的线程在指定的毫秒数内停止。

语法:

public static native void sleep( long ms) throws InterruptedException ;

public static void sleep(long ms , int ns) throws InterruptedException;

方法1:sleep()方法

java中的每个sleep()方法都会抛出一个InterruptedException,这是一个被检查过的异常,因此当我们使用sleep方法时,应该通过try-catch或者throws关键字来处理它,否则我们会得到编译时错误。

实现: 在这里,让主线程在 “println”语句后睡眠5秒钟。所以每次都需要5秒钟的时间来打印。

import java.io.*;
import java.util.*;

// Main class
class YiibaiDemo {

    // 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 time
            System.out.println("time-" + i);

            // Putting the main thread to sleep for 5 second
            Thread.sleep(5000);
        }
    }
}

运行结果:

time- 1
time- 2
time- 3
time- 4
time- 5
time- 6
time- 7
time- 8
time- 9
time- 10

方法2:yield()方法

它使当前执行的线程暂停,以便给相同优先级的等待线程提供机会。如果没有等待的线程或者所有等待的线程的优先级都很低,那么同一个线程可以继续执行。如果多个线程以相同的优先级在等待,那么哪个等待的线程将获得机会,我们不能说这取决于线程调度器。哪一个线程会再次获得机会,也取决于线程调度器。

语法:

public static native void yield();

Java示例代码:

// Java Program to illustrate yield() method from yiibai.com

// Importing input output classes
import java.io.*;
// Importing all utility classes
import java.util.*;

// Class 1
class myThread extends Thread {
    public void run()
    {

        // Displaying the message
        System.out.println("Child Thread");

        // Calling yield() method
        Thread.yield();
    }
}

// Class 2
// Main class
class YiibaiDemo {

    // Main driver method
    public static void main(String[] args)
        throws InterruptedException
    {
        myThread t = new myThread();
        t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println("Main Thread");
        }
    }
}

运行结果:

输出解释:

在上面的程序中,如果注释了Thread.yield()这一行,那么两个线程将同时执行,我们无法预期哪个线程会先完成。如果没有注释Thread.yield()方法,那么因为主线程会有更多的机会,而先完成主线程的机会就会很高。

最后总结一下它们之间的区别 -

属性 Yield方法 sleep方法
目的 如果一个线程想暂停它的执行,给其余相同优先级的线程以机会,那么应该选择屈服法。 如果一个线程在特定的时间内不想执行任何操作,那么应该选择睡眠方法。
重载 这个方法没有重载 sleep方法是重载的。
Exception 这个方法不抛出异常 这个方法抛出中断的异常
原生的 这个方法是原生的 在这两个重载的方法中,只有sleep(long ms)是重载的,而其他的不是。
放弃监视器 这个方法放弃了监视器。 这个方法不会导致当前执行的线程放弃监视器。

Java中sleep和yield方法的区别

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Java中sleep和yield方法的区别
本文链接:https://www.vsdiffer.com/vs/difference-between-sleep-and-yield-method-in-java.html
免责声明:以上内容仅代表 个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。