线程的sleep和yield

xl_echo编辑整理,欢迎转载,转载请声明文章来源。更多IT、编程案例、资料请联系QQ:1280023003,加群298140694。百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!!


sleep 是一个静态方法,观察其源码可以看到,其中有两个重载方法,其中一个需要传入毫秒数,另外一个既需要毫秒数还需要纳秒数。

yield 这是一个将线程状态回逆的方法,主要作用是将线程从运行状态转换到就绪状态。这个方法很少使用

sleep

sleep主要的作用就是让线程沉睡,sleep方法有以下两个:

public static native void sleep(long millis) throws InterruptedException;
public static void sleep(long millis, int nanos)throws InterruptedException {
        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
            millis++;
        }

        sleep(millis);
    }

第一个方法参数就是只是毫秒值,参数为100,线程就休眠100毫秒;
第二个方法参数多一个纳秒值,参数为(1000,10),的时候线程就休眠1000毫秒10纳秒;

我们可以从一个例子看到这个方法的效果:

package com.example.mybatisplusdemo.test;

/**
 * @Author xl_echo
 * @Date 2018/8/8 上午10:53
 **/
public class Test {

  public static void main(String[] args) {
    new Thread(() -> {
      long startTime = System.currentTimeMillis();
      sleep(2_000L);//2_000L 等效2000,这样在数字较大时,可读性更强
      long endTime = System.currentTimeMillis();
      System.out.println(Thread.currentThread().getName() + "休眠时间:" + (endTime - startTime));
    }).start();

    long startTime = System.currentTimeMillis();
    sleep(3_000L);
    long endTime = System.currentTimeMillis();
    System.out.println(Thread.currentThread().getName() + "休眠时间:" + (endTime - startTime));
  }

  private static void sleep(long ms) {
    try {
      Thread.sleep(ms);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
}

如果休眠时间较长,可以参考TimeUnit代替Thread.sleep,代码会更优雅,而且不需要计算毫秒值了,直接设置即可。不常见,除非项目有特许要求。这里不暂时,有兴趣的朋友可以去查一下。

这里不讲解yield,所用不多,而且sleep和yield的作用是比较容易分辨的。sleep一定会使Thread进入休眠,但是yield不同,在CPU没有忽略调度提示的时候进入释放CPU让线程达到sleep相同的效果。

猜你喜欢

转载自blog.csdn.net/xlecho/article/details/81542632