java中的Thread.sleep()

本文探讨了Java中Thread.sleep()方法的使用场景及注意事项,解释了sleep(1000)和sleep(0)的实际效果,并从操作系统层面揭示了运行态、就绪态和等待态的转换机制。

======================================================
注:本文源代码点此下载
======================================================

前两天电面过来,在海吹项目的时候,问到了thread.sleep()问题。感觉没什么啊,不就是线程睡眠一下,好让别的线程把任务做完嘛。

我当时为什么要用sleep()呢?是这样:一个主线程负责一项计算任务,它把这项任务分解开,分成n份子任务,每个子任务放到一个线程中,这样n个子任务并行计算。(其实单核情况下,又没有io需求,这样做是不会提高效率的,这里只是顺应并发的思想....)主线程呢,分配好了后,sleep()一下,睡完后把结果收上来整合。喏,就这么回事。

有人提到过两个问题:

1、假设现在是 2008-4-7 12:00:00.000,如果我调用一下 thread.sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?

2、某人的代码中用了一句看似莫明其妙的话:thread.sleep(0) 。既然是 sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?

这两个问题在http://dev.tot.name/java/html/20090225/20090225101644.htm上做了解释,作者举的ppmm的例子蛮生动的哈。归结起来就是说:在windows环境下,进程调度是抢占式的。一个进程在运行态时调用sleep(),进入等待态,睡眠结束以后,并不是直接回到运行态,而是进入就绪队列,要等到其他进程放弃时间片后才能重新进入运行态。所以sleep(1000),在1000ms以后,线程不一定会被唤醒。sleep(0)可以看成一个运行态的进程产生一个中断,由运行态直接转入就绪态。这样做是给其他就绪态进程使用时间片的机会。总之,还是操作系统中运行态、就绪态和等待态相互转化的问题。


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
<think>我们被要求提供一个在Java中使用Thread.sleep方法让线程休眠1分钟的具体实现示例。根据引用内容,我们知道Thread.sleep的基本用法,也了解到有更优雅的方式(如使用TimeUnit),但用户明确要求使用Thread.sleep方法。注意:Thread.sleep方法接受毫秒数。要让线程休眠1分钟,我们需要将分钟转换为毫秒。1分钟=60秒,1秒=1000毫秒,因此1分钟=60*1000=60000毫秒。因此,我们可以这样写:Thread.sleep(60000);同时,我们也注意到Thread.sleep方法会抛出InterruptedException,所以我们需要处理这个异常(通常使用try-catch)。根据引用[1]中的示例,我们可以编写一个简单的程序来演示休眠60秒。我们将编写一个类,在休眠前后打印当前时间,以展示休眠效果。示例代码如下:</think>在 Java 中使用 `Thread.sleep()` 方法实现线程休眠 60 秒的示例如下: ```java public class SleepExample { public static void main(String[] args) { System.out.println("休眠开始时间: " + new java.util.Date()); try { // 休眠60秒(60,000毫秒) Thread.sleep(60 * 1000); } catch (InterruptedException e) { System.err.println("休眠被中断: " + e.getMessage()); } System.out.println("休眠结束时间: " + new java.util.Date()); } } ``` ### 关键说明: 1. **时间单位转换** 休眠时间需以**毫秒**为单位,`60 秒 = 60,000 毫秒`,通过 `60 * 1000` 实现单位转换。 2. **异常处理** `Thread.sleep()` 必须处理 `InterruptedException`,当其他线程中断当前休眠时会触发此异常[^1][^2]。 3. **执行效果** 程序将: - 打印开始休眠的时间戳 - 暂停执行 60 秒 - 打印结束休眠的时间戳 > ⚠️ **注意**:对于更可读的时间单位处理,建议使用 `TimeUnit`(需 Java 5+): > ```java > TimeUnit.SECONDS.sleep(60); // 语义更清晰 > ``` > 其底层仍调用 `Thread.sleep()`,但自动处理时间单位转换[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值