sleep 是一个静态方法,它有两个重载方法,其中一个需要传入毫秒数,另外一个需要传入毫秒数和纳秒数。
sleep 的方法
public static native void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanos) throws InterruptedException
sleep 方法会使当前线程进入指定毫秒数的休眠,暂停执行,虽然给定了一个休眠的时间,但是最终要以系统的定时器和调度器的精度为准。
package concurrent;
import static java.lang.Thread.sleep;
public class ThreadSleep {
public static void main(String[] args) {
new Thread(() -> {
long startTime = System.currentTimeMillis();
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(String.format("Total spend %d ms", (endTime - startTime)));
}).start();
long startTime = System.currentTimeMillis();
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(String.format("Total spend %d ms", (endTime - startTime)));
}
}
Total spend 2013 ms
Total spend 3008 ms
分别在自定义线程和主线程进行了休眠,每个线程的休眠互不影响,Thread.sleep 只会导致当前线程进入指定时间休眠。
在 JDK 1.5 以后,JDK 引入一个枚举 TimeUnit,它对 sleep 方法提供了很好的封装,使用它可以省去时间单位的换算步骤。
package concurrent;
import java.util.concurrent.TimeUnit;
import static java.lang.Thread.sleep;
public class TimeUnitTest {
public static void main(String[] args) {
new Thread(() -> {
long startTime = System.currentTimeMillis();
try {
sleep(88);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(String.format("Total spend %d ms", (endTime - startTime)));
}).start();
long startTime = System.currentTimeMillis();
try {
TimeUnit.HOURS.sleep(0);
TimeUnit.MINUTES.sleep(0);
TimeUnit.SECONDS.sleep(0);
TimeUnit.MILLISECONDS.sleep(88);
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
System.out.println(String.format("Total spend %d ms", (endTime - startTime)));
}
}
Total spend 88 ms
Total spend 88 ms
TimeUnit.HOURS.sleep(3);
TimeUnit.MINUTES.sleep(24);
TimeUnit.SECONDS.sleep(17);
TimeUnit.MILLISECONDS.sleep(88);
// 等价于下面的代码
Thread.sleep(12257088)
同样的时间表达,TimeUnit 显然清晰多了,所以建议,在使用 Thread.sleep 的地方,完全使用 TimeUnit 来代替,因为 sleep 能做的事,TimeUnit 全部都能完成,并且功能更加强大。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/122901756
内容来源于网络,如有侵权,请联系作者删除!