Java线程休眠之sleep方法详解
让线程睡眠的sleep方法
Thread 类中有一个静态方法的sleep方法,当该线程调用sleep方法后,就会暂时让CPU的调度权。
但是监视器资源比如锁并不会释放出去。在指定睡眠时间后,函数会正常返回。
如果线程在睡眠过程中如果如果调用了该线程的interrupt方法终端该线程,则会抛出sleep内的InterruptedException异常而返回。
下面举个例子,该线程在睡眠的拥有的监视器并不会被释放。
package com.example.demo.runnable.ChapterOne; import java.util.concurrent.locks.ReentrantLock; /** * @author 49800 */ public class SleepTest { private static final ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { Thread threadA = new Thread(() -> { lock.lock(); try { System.out.println("ThreadA 在执行了"); Thread.sleep(10000); System.out.println("ThreadA 执行完成了"); } catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } }); Thread threadB = new Thread(() -> { lock.lock(); try { System.out.println("ThreadB 在执行了"); Thread.sleep(10000); System.out.println("ThreadB 执行完成了"); } catch (Exception e) { e.printStackTrace(); }finally { lock.unlock(); } }); threadA.start(); threadB.start(); System.out.println("Main 方法已经在执行了"); try { threadA.join(); threadB.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Main 方法已经在执行完成了"); } }
上面用到了独占锁,独占锁就是当一个线程在使用该锁的时候,另一个线程必须等另一个线程释放锁后,下一个线程才能执行。
这样上面两个线程就不会交叉执行。从上面的执行结果来看,当某一线程在在开始执行后。
执行到sleep方法,就暂停十秒才会打印执行完成。因为调用了join的方法,所以必须这两个线程执行完成后才能执行main方法。
在线程睡眠时,其他线程调用该线程的sleep方法,则会抛出异常。
package com.example.demo.runnable.ChapterOne; /** * @author 49800 */ public class SleepExceptionTest { public static void main(String[] args) { Thread thread = new Thread(() -> { try { System.out.println("开始执行"); Thread.sleep(10000); System.out.println("执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } }); thread.start(); try { // Main 方法睡眠3s Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } thread.interrupt(); } }
结果:
子线程在睡眠期间,主线程中断了他,所以在主线程在调用sleep方法后抛出了异常。
另外需要注意的事sleep(long millis)是毫秒值,当传入的是一个负数的时候也是会抛出异常的。
到此这篇关于Java线程休眠之sleep方法详解的文章就介绍到这了,更多相关Java线程休眠内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot部署到外部Tomcat无法注册到Nacos服务端的解决思路
这篇文章主要介绍了SpringBoot部署到外部Tomcat无法注册到Nacos服务端,本文给大家分享完美解决思路,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下2023-03-03spring boot整合mybatis使用c3p0数据源连接mysql
这篇文章主要为大家详细介绍了spring boot整合mybatis使用c3p0数据源连接mysql,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-03-03
最新评论