Java中sleep()和yield()方法之间的区别

时间:2020-01-09 10:35:08  来源:igfitidea点击:

在本文中,我们将看到Java中sleep()和yield()方法之间的区别。由于这两个方法sleep()和yield()都导致当前正在执行的线程挂起其执行,因此某些用户发现它难以区分sleep和wait方法。因此,让我们尝试看看Java中sleep()和yield()方法之间的区别。

Java中的sleep()和yield()方法

如前所述,这两种方法都用于挂起当前线程的执行,但是sleep()方法更适合用于该目的。之所以倾向于使用sleep()方法,是因为它实际上会导致当前正在执行的线程在指定的时间段内进入睡眠状态,而yield()只是向调度程序暗示当前线程愿意屈服当前使用的处理器。调度程序也可以忽略此提示。这使yield()方法变得不确定。

甚至Java文档也说类似的话

It is rarely appropriate to use yield() method. It may be useful for debugging or testing purposes, where it may help to reproduce bugs due to race conditions.

参考https://docs.oracle.com/javase/10/docs/api/java/lang/Thread.html#yield()

查看这两种方法,我们会发现很多相似之处

  • yield()和sleep()方法都是java.lang.thread类的成员,并且它们都是静态方法
  • 这两种方法都在当前执行的线程上起作用。因此,调用Thread.sleep()或者Thread.yield()方法将暂停当前正在执行的线程的执行。
  • yield()和sleep()方法都可以在任何上下文中使用,与wait()方法不同,在同步上下文中没有强制调用。即使从同步块或者方法中调用这些方法,线程也不会按照wait()方法的要求释放对象的锁。

Java中的sleep()与yield()

现在,我们已经了解了sleep()和yield()方法的一般描述,甚至看到了它们之间的相似之处,现在该探讨一下Java多线程中sleep和yield方法之间的区别了。

  • sleep()方法将持续时间作为参数,并确保当前线程在指定时间内中止其执行。 yield()方法只是对调度程序的提示,即当前线程愿意放弃其对处理器的当前使用。调度程序甚至可以忽略此提示来产生。
  • 当调用sleep()方法时,当前线程肯定会在指定时间内进入睡眠状态。首先,在yield()方法的情况下,它只是一个可以忽略的提示,即使当前线程产生了CPU,如果没有其他具有相同或者更多线程优先级的线程,它也可以重新开始运行。
  • 如果睡眠线程被中断,sleep()方法将引发InterruptedException,因此对sleep()方法的调用应包含在try-catch块中,或者应使用throws子句声明。 yield()方法不会引发InterruptedException。

yield方法Java示例

public class TestThread  implements Runnable {
  @Override
  public void run() {
    System.out.println(Thread.currentThread().getName() + " Entering run method");	
    for(int i = 0; i < 3; i++){
      System.out.println(Thread.currentThread().getName() + " Value - " + i);		
      if(i == 1){
        Thread.yield();
      }
    }		
  }
	
  public static void main(String[] args) {
    TestThread obj = new TestThread();
    Thread t1 = new Thread(obj);
    Thread t2 = new Thread(obj);
    Thread t3 = new Thread(obj);
    //long startTime = System.currentTimeMillis();
    t1.start();
    t2.start();
    t3.start();
  }
}

输出:

Thread-1 Entering run method
Thread-2 Entering run method
Thread-2 Value - 0
Thread-2 Value - 1
Thread-0 Entering run method
Thread-0 Value - 0
Thread-0 Value - 1
Thread-1 Value - 0
Thread-1 Value - 1
Thread-2 Value - 2
Thread-0 Value - 2
Thread-1 Value - 2

从输出中可以看到,当i的值为1时,每个线程都在释放CPU,从而使另一个线程有机会执行。