线程休眠 (sleep)

左手的ㄟ右手 2022-10-05 01:51 289阅读 0赞

上一篇:线程的状态

上一篇在看线程状态的时候我们用到了线程的几个方法例如:
sleep join 实际上,这些方法就是对线程的调度(scheduled)

本篇文章,我们先来看看线程的sleep


sleep 线程休眠

sleep是让当前线程进入休眠状态,让出CPU资源,但是不会释放锁。
使用场景:延时执行
例如,Android中的版本更新逻辑,一般我们是在进入主页面几秒后去请求接口获取版本更新信息,就可以用sleep实现。

我们先来看下源码:

在这里插入图片描述

可以看到,sleep() 方法是一个静态的本地方法,接收一个long类型的毫秒值。

我们先来用一下:

  1. public static void main(String[] args) {
  2. Thread thread = new Thread(() -> {
  3. String threadName = Thread.currentThread().getName();
  4. System.out.println(threadName + "线程开始执行");
  5. try {
  6. Thread.sleep(2000);
  7. } catch (InterruptedException e) {
  8. e.printStackTrace();
  9. }
  10. System.out.println(threadName + "任务执行完毕");
  11. }, "work");
  12. thread.start();
  13. System.out.println("main线程执行");
  14. }

运行结果:

在这里插入图片描述
可以看到,work线程休眠了两秒

这里有一个小坑,需要注意下:
我们看到了源码是一个static修饰的方法,那也就是说我们也可以通过对象去调用,下面我们通过对象调用看看是什么效果。

  1. public static void main(String[] args) {
  2. Thread thread = new Thread(() -> {
  3. String threadName = Thread.currentThread().getName();
  4. System.out.println(threadName + "线程开始执行");
  5. System.out.println(threadName + "任务执行完毕");
  6. }, "work");
  7. thread.start();
  8. try {
  9. thread.sleep(2000);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. System.out.println("main线程执行");
  14. }

运行结果如下,可以看到,虽然我们调用的是thread.sleep(),但实际休眠的是主线程。
在这里插入图片描述

也就是说,sleep方法的调用只跟当前线程有关,在哪个线程调sleep,哪个线程就会休眠。

下面我们多加点打印看下是不是这样:

  1. public static void main(String[] args) {
  2. Thread thread = new Thread(() -> {
  3. String threadName = Thread.currentThread().getName();
  4. System.out.println(threadName + "线程开始执行");
  5. try {
  6. System.out.println(threadName + "开始休眠");
  7. Thread.sleep(3000);
  8. System.out.println(threadName + "休眠完毕");
  9. } catch (InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. System.out.println(threadName + "任务执行完毕");
  13. }, "work");
  14. thread.start();
  15. String threadName = Thread.currentThread().getName();
  16. try {
  17. System.out.println(threadName + "开始休眠");
  18. thread.sleep(2000);
  19. System.out.println(threadName + "休眠完毕");
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. System.out.println(threadName + "线程执行完毕");
  24. }

运行结果如下:

在这里插入图片描述

可以看到,确实是 在哪个线程调sleep,哪个线程就会休眠


使用TimeUnit来更简单的实现线程sleep

由于Thread的sleep方法接收的是一个long类型的毫秒值,也就是说,休眠的时间需要我们自己去换算,用起来不是很方便。我们可以用 package java.util.concurrent 包下面的 TimeUnit 来更简单的实现线程的sleep。

先看下TimeUnit源码中的属性和方法,如下:
在这里插入图片描述
可以看到,TimeUnit给我们提供好了时间的单位,以及相互转换的方法,还提供了sleep方法。
在这里插入图片描述

可以看到,最终调用的还是Thread的sleep方法,帮我们实现了转换时间的代码。

我们来用一下:

  1. public static void main(String[] args) {
  2. Thread thread = new Thread(() -> {
  3. String threadName = Thread.currentThread().getName();
  4. System.out.println(threadName + "线程开始执行");
  5. try {
  6. System.out.println(threadName + "开始休眠");
  7. TimeUnit.MILLISECONDS.sleep(2000);//休眠2000毫秒
  8. System.out.println(threadName + "休眠完毕");
  9. } catch (InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. System.out.println(threadName + "任务执行完毕");
  13. }, "work");
  14. thread.start();
  15. String threadName = Thread.currentThread().getName();
  16. try {
  17. System.out.println(threadName + "开始休眠");
  18. TimeUnit.SECONDS.sleep(1);//休眠1秒
  19. System.out.println(threadName + "休眠完毕");
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. }
  23. System.out.println(threadName + "线程执行完毕");
  24. }

运行结果如下:
在这里插入图片描述

好了,线程的休眠就是这些

下一篇:

线程合并 (join)


如果你觉得本文对你有帮助,麻烦动动手指顶一下,可以帮助到更多的开发者,如果文中有什么错误的地方,还望指正,转载请注明转自喻志强的博客 ,谢谢!

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Thread--线休眠sleep

    sleep()的作用是让当前线程进入休眠,当前线程会由运行状态进入到阻塞状态,sleep()可以指定休眠时间,休眠时间会大于等于该休眠时间,在线程被重新唤醒时,线程的状态由阻塞

    相关 线休眠

    线程对象一旦调用其`start`方法之后,就会运行,运行的就是`run`方法中的代码,等到`run`方法中的代码运行结束,线程就执行完成。