Thread.sleep(long millis)方法能够以毫秒为时间单位暂停当前执行的线程,参数值为毫秒不能为负数,否则将抛出 IllegalArgumentException 异常
1、它总是暂停当前执行的线程
2、实际休眠的线程在唤醒开始执行前依赖于操作系统定时器和调度器,对于一个平稳的系统来住,线程实际执行的时间接近于指定线程休眠时间,但是对于一个忙碌的系统来说它将稍微超出一些
@Slf4j public class ThreadDemo { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { log.info("开始执行"); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } }, "t1"); t1.start(); log.info("t1 线程的状态为: {}",t1.getState()); TimeUnit.SECONDS.sleep(1); log.info("t1 线程的状态为: {}",t1.getState()); } }
线程调用 sleep() 方法之后,线程状态由 RUNNABLE 转变为 TIME_WAITING
线程 sleep 时间到了之后,线程由阻塞态转变为就绪态,就绪态的线程不会立马执行,需要等待操作系统分配 CPU 时间片,所以系统空闲时,该线程能在较短的时间内分配到 CPU 时间片,故线程实际执行的时间接近于指定线程休眠时间,但是当系统繁忙时,该线程需要等待一定的时间才能获取到 CPU 的执行权,所以线程实际执行要稍微超出 sleep 参数时间
3、当线程休眠时不会丢失已经获得的监控和锁
4、任何线程都能中断当前休眠的线程、将导致 InterruptedException 异常抛出
@Slf4j public class ThreadDemo { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { log.info("开始执行"); try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { log.info(Thread.currentThread().getName()+" 被打断了"); log.info("呜呜呜.........."); e.printStackTrace(); } }, "t1"); t1.start(); log.info(Thread.currentThread().getName()+" 将要开始打断 t1 线程"); t1.interrupt(); } }
在其它线程中通过调用 t1.interrupt() 方法可以打断 t1 线程,t1 线程被打断后会抛出异常,转而执行 catch 块中的代码
5、有时会在循环中写 Thread.sleep(0),这样做的意义是什么
调用 sleep() 方法之后,线程的状态由运行态转变为阻塞状态,而休眠时间到了之后,线程由阻塞态转变为就绪态,而 sleep(0) 可以看做是不经过阻塞态,线程由运行态直接变成就绪状态,让出 CPU 的执行权,从而触发操作系统立刻进行一次 CPU 的竞争,重新计算优先级,防止该线程独占 CPU 资源,实际上 sleep(0) 效果并不好,CPU 占用率还是很高,建议写 sleep(50)
@Slf4j public class ThreadDemo { public static void main(String[] args) throws InterruptedException { while(true){ log.info("hello xiao mao mao"); } } }
一直循环的情况下 CPU 占用 98%,加入 Thread.sleep(0)
@Slf4j public class ThreadDemo { public static void main(String[] args) throws InterruptedException { while(true){ // 让出 CPU 控制权 TimeUnit.MILLISECONDS.sleep(50); log.info("hello xiao mao mao"); } } }
可以很明显的看出 CPU 占用率降低到了 4.6%
标签:log,Thread,t1,线程,sleep,方法,CPU From: https://www.cnblogs.com/xiaomaomao/p/17212823.html