Java线程休眠之sleep方法详解

 更新时间:2024年01月18日 09:59:53   作者:小白不很白  
这篇文章主要介绍了Java线程休眠之sleep方法详解,Thread 类中有一个静态方法的sleep方法,当该线程调用sleep方法后,就会暂时让CPU的调度权,但是监视器资源比如锁并不会释放出去,需要的朋友可以参考下

让线程睡眠的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线程休眠内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java JDK 动态代理的使用方法示例

    Java JDK 动态代理的使用方法示例

    Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。下面这篇文章主要给大家分享了关于Java JDK 动态代理的使用方法示例,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-07-07
  • javaweb 项目初始配置的方法步骤

    javaweb 项目初始配置的方法步骤

    本文主要介绍了javaweb 项目初始配置的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • SpringBoot整合Shiro的方法详解

    SpringBoot整合Shiro的方法详解

    Apache Shiro是一个java安全(权限)框架,Shiro可以非常容易的开发出足够好的应用,其不仅可以用在javase环境,也可以用在javaee环境。本文介绍了SpringBoot整合Shiro的方法,需要的可以参考一下
    2022-05-05
  • Spring中缓存注解@Cache的使用详解

    Spring中缓存注解@Cache的使用详解

    这篇文章主要介绍了Spring中缓存注解@Cache的使用详解,使用注解对数据进行缓存功能的框架,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码,需要的朋友可以参考下
    2023-07-07
  • 保证缓存和数据库的数据一致性详解

    保证缓存和数据库的数据一致性详解

    在实际开发过程中,缓存的使用频率是非常高的,只要使用缓存和数据库存储,就难免会出现双写时数据一致性的问题,本文主要介绍了如何保证缓存和数据库的数据一致性,需要的小伙伴可以参考阅读
    2023-04-04
  • JVM优先级线程池做任务队列的实现方法

    JVM优先级线程池做任务队列的实现方法

    这篇文章主要介绍了JVM优先级线程池做任务队列的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Java-Redis-Redisson分布式锁的功能使用及实现

    Java-Redis-Redisson分布式锁的功能使用及实现

    这篇文章主要介绍了Java-Redis-Redisson-分布式锁的功能使用及实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • SpringBoot整合Swagger框架过程解析

    SpringBoot整合Swagger框架过程解析

    这篇文章主要介绍了SpringBoot整合Swagger框架过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • springboot实现分段上传功能的示例代码

    springboot实现分段上传功能的示例代码

    这篇文章主要介绍了springboot实现分段上传,包括文件上传下载,断点续传,增量上传功能,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • SpringBoot中使用Jsoup爬取网站数据的方法

    SpringBoot中使用Jsoup爬取网站数据的方法

    这篇文章主要介绍了SpringBoot中使用Jsoup爬取网站数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06

最新评论