为什么要使用sleep暂停线程

有多种方法可以暂停或停止当前正在运行的线程,但是使用Thread.sleep()方法将线程置于睡眠状态才是暂停线程的正确方法。有些人会说,为什么不用wait和notify呢?仅仅为了暂停线程而使用这些方法并不是好方案,这些是有条件等待的方法,它们不依赖于时间。如果使用wait()阻塞的线程将一直等待,直到它所等待的条件发生改变。当然,你可以将timeout放在那里,但是毕竟wait()方法的用途是有所不同的,它们是为Java中的线程间通信而设计的。通过使用sleep()方法,可以将当前值暂停一段时间。因此你不应该使用sleep()来代替wait()和notify(),反之亦然。等待和通知不应该用来暂停线程的另一个原因是,它们需要锁。你只能从同步方法或块中调用它们,并获取和释放锁,这是比较昂贵的。

更重要的是,为什么仅仅为了暂停线程而引入锁呢?wait()和sleep()方法之间的关键区别之一是,Thread.sleep() 将当前线程置于wait状态,但不会释放它持有的任何锁,但wait会在进入阻塞状态之前释放它持有的锁。

简而言之,多线程并不容易,即使是创建线程、停止线程或暂停线程这样的简单任务也需要对Java API有很好的了解。你需要在正确的地方使用正确的方法。如果你真的想要掌握多线程和并发性,我建议你在实践中阅读两次Java并发实践,并完成书中给出的每个示例。那本书将会改变你对多线程的认识,以及思考相关问题的思路。

如何使用sleep暂停线程

下面是相关的代码示例,使用Java中的Thread .sleep()和TimeUnit.sleep()方法来暂停正在运行的线程。在这个简单的程序中,我们有两个线程,主线程由JVM启动,通过调用公共静态void main(String args[])方法来执行Java程序。第二个线程是“T1”,是我们创建用来运行一个循环业务的。我们传递给这个线程的Runnable任务有一个无限的while循环,该循环一直运行到满足条件停止。仔细观察,就会发现我们使用了一个volatile修饰符来停止Java中的一个线程。

主线程首先启动子线程,然后在继承Runnable的Game类中使用stop()方法来停止线程。当T1线程启动时,进入一个循环里,然后暂停200毫秒。在这两者之间,我们还使用TimeUnit.sleep()方法使主线程进入睡眠状态,所以主线程将等待一段时间,直到T1线程执行任务结束。

在示例中,我们了解到在Java中暂停线程的两种方法,即使用Thread.sleep()方法和TimeUnit.sleep()方法。传递给Thread.sleep()的参数是毫秒单位的睡眠时间,但这在代码中并没有清晰体现,这就是TimeUnit类的作用所在。

你可以引用特定时间单元的TimeUnit实例,例如在调用sleep之前,先使用TimeUnit.SECONDS或TimeUnit.MICROSECOND。这样你就可以更清楚地看到一个线程将等待多长时间。简而言之,建议使用TimeUnit类的sleep()方法来暂停一个线程,因为它更具可读性。

import java.util.concurrent.TimeUnit;import static java.lang.Thread.currentThread;public class Thread6 {public static void main(String args[]) throws InterruptedException {Game game = new Game();Thread t1 = new Thread(game, "T1");//启动子线程t1.start();//停止子线程System.out.println(currentThread().getName() + " is stopping game thread");game.stop();//等待,确认子线程已经停止TimeUnit.MILLISECONDS.sleep(200);System.out.println(currentThread().getName() + " is finished now");}}class Game implements Runnable{private volatile boolean isStopped = false;public void run() {while(!isStopped){System.out.println("Game thread is running.....");System.out.println("Game thread is now going to pause");try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Game thread is now resumed ..");}System.out.println("Game thread is stopped....");}public void stop(){isStopped = true;}
}

输出结果:

Game thread is running.....
Game thread is now going to pause
main is stopping game thread
Game thread is now resumed ..
Game thread is stopped....
main is finished now

关于sleep()方法的要点

现在已经知道了如何让线程处于睡眠状态或暂停状态,接下来看看Thread.sleep()方法的一些技术细节。

1) sleep()是一个静态方法,它总是将当前线程置为睡眠状态。

2) 你可以调用正在休眠的线程的interrupt()方法,来唤醒正在休眠的线程。

3) sleep方法并不能保证线程会精确地休眠到你指定的时间点,它的准确性取决于系统计时器,并且线程可能在此之前被唤醒。

4)它不会释放它所获得的锁。

总结

以上就是如何使用Thread.sleep()方法和TimeUnit的sleep()方法使线程暂停的内容,建议使用TimeUnit类,因为它提高了代码的可读性,虽然其实也不难记住传递给sleep()方法的参数是以毫秒为单位的。需要记住的两个关键要点,Thread.sleep()是一个静态方法,它总是将当前线程置为休眠状态,并且不会释放休眠线程持有的任何锁。

十分钟搞定Java多线程-如何使用sleep()方法和TimeUnit暂停线程相关推荐

  1. JAVA微信企业付款到零钱(十分钟搞定),附完整DEMO下载

    最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信提现功能开发的流程, 主要就是按规则封装好请求参数调用微信接口,涉及一些签名校验: A.接口流程 获取用户OPENI ...

  2. java 分组报表_【Java】分组报表怎么做,积木报表十分钟搞定!

    首页 专栏 java 文章详情 0 分组报表怎么做,积木报表十分钟搞定! scott发布于 今天 12:24 报表需求 某大型超市需要做一张年度区域销售统计报表 展示2019和2020年度各地区每月的 ...

  3. java零钱换整程序_JAVA微信企业付款到零钱(十分钟搞定),

    JAVA微信企业付款到零钱(十分钟搞定), 最近帮朋友做了一个简单的微分销系统,实现从企业付款到零钱分润的功能,简单记录一下微信企业付款到零钱的开发过程, 主要就是按规则封装好请求参数调用微信接口,涉 ...

  4. JeecgBoot 单体升级微服务快速方案(十分钟搞定)

    JeecgBoot 单体升级微服务方案(十分钟搞定) 当前系统分为system.demo 等模块,现有需求把每个模块单独启动作为微服务应用,故而推出新版boot[20200812beta],支持快速切 ...

  5. 逗号后面统一加空格_十分钟搞定字幕,教你做加字幕的“快手菜”

    平台上许多同学有疑问:做视频是否有加字幕的必要呢? 其实除了外语需要翻译.语速过快加字幕方便理解.普通话不标准等情况之外,还是建议有余力的同学可以加上字幕,提升用户的观看体验. 那么问题来了,存在以下 ...

  6. 【Java多线程】轻松搞定Java多线程(一)

    轻松搞定Java多线程(一) Java多线程详解(一) 1. 线程简介 2.线程的创建 2.1 三种创建方式 2.2 Thread 2.3 实现Runnable 2.3.1 初识并发问题 2.3.2 ...

  7. 全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析

    全网最简单的C# json数据解析 无敌菜鸟教程 十分钟搞定json数据解析 废话先说一点,算了.直接进入正题吧. 用例子说话: JSON数据: string json: " {" ...

  8. 四、通勤路上搞定 Java 多线程面试(1)

    前言 谈到多线程,一般都会联想到高并发,但是实际上两者并不是一个概念,高并发一般指的是从业务方面的描述系统的并发负载能力,而多线程只不过是如何使CPU的利用率达到最大化.因此一般问到高并发,都会从你的 ...

  9. 10分钟搞定 Java 并发队列

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

最新文章

  1. android 反编译报错,android反编译
  2. 数据库经典书籍--数据库系统概念
  3. 修改审查元素怎么保存_手机qq性别怎么改成空白
  4. LeetCode 2181. 合并零之间的节点(链表)
  5. Android程序员必备精品资源
  6. 3D模型欣赏:斯巴达女将军 长枪圆盾战士 性感美女
  7. 如何说服你的同事使用TDD
  8. 【Python量化】蒙特卡洛模拟法进行期权定价
  9. 微信小程序音乐播放器系统app毕业设计
  10. kafka 中如何保证数据消息不丢失
  11. 使用八种牛云存储解决方案ios7.1的app部署问题
  12. 卢卡斯定理扩展卢卡斯
  13. vba字典重复key_字典去除重复项问题
  14. Azure Stack技术深入浅出系列6:Azure Stack一体机探究 — 揭开黑盒子的神秘面纱
  15. 腾讯地图实现点击搜索地址功能
  16. ION内存管理器介绍
  17. ECshop导入淘宝数据包乱码问题解决方法
  18. linux、FreeBSD网桥转发性能对比
  19. MPLS PW Control Word与Associated Channel
  20. banq修复_设计模式builder(Banq)

热门文章

  1. rabbitmq 常用命令,启停 启停插件(亲测!亲测!亲测!)
  2. 华为mate40pro鸿蒙冷散热,原创 华为mate40pro亮利剑:麒麟1020+双6400万+鸿蒙系统,这才是华为...
  3. 手机屏幕失灵,触屏失灵,屏幕划不动急救
  4. 【easyUI】easyUI Confirm使用方法及配置文字以及回调以及【更改源码】扩展功能修改按钮文字;
  5. 记录一个下载的皮肤资源包问题
  6. typora中文免费版
  7. 原谅别人就等于解脱自己
  8. 训练--小菲菲爱数数
  9. 汉化IDEA的方法 IntelliJ IDEA Community Edition
  10. 【Demo】iOS平台上的讯飞语音识别语音合成开发