让线程睡眠的sleep方法

  • Thread类有一个静态的sleep方法,当一个执行中的线程调用了Thread的sleep方法,调用线程就会让出指定时间的执行权,也就是在这期间不参与CPU调度,但是该线程持有的除了CPU以外的资源是不允许让出的,指定的睡眠时间到了后该函数会正常返回,线程就会处于就绪状态,然后参与CPU的调度,在获取到CPU的资源后就可以继续运行了。如果在睡眠期间被其他线程调用了interrupt()方法中断了该线程,则该线程会在调用sleep方法会抛出InterruptedException异常而返回。

    package com.heiye.temp;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock; public class SleepTest2 {
    //创建一个独占锁
    public static final Lock lock=new ReentrantLock(); public static void main(String[] args) {
    //创建线程A
    Thread threadA=new Thread(new Runnable() {
    @Override
    public void run() {
    //获取独占锁
    lock.lock();
    try{
    System.out.println("child threadA is in sleep");
    Thread.sleep(10000);
    System.out.println("child threadA is in awaked");
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    //释放锁
    lock.unlock();
    }
    }
    }); //创建线程B
    Thread threadB=new Thread(new Runnable() {
    @Override
    public void run() {
    //获取独占锁
    lock.lock();
    try{
    System.out.println("child threadB is in sleep");
    Thread.sleep(10000);
    System.out.println("child threadB is in awaked");
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    //释放锁
    lock.unlock();
    }
    }
    }); //启动线程
    threadA.start();
    threadB.start();
    }
    }

    如上代码首先会创建一个独占锁,然后创建两个线程,每个线程在内部首先会获得锁,然后睡眠,睡眠结束后会释放锁,尽管A先睡眠,但是锁仍然是A的。

  • 当一个线程处于睡眠状态下,如果另外一个线程中断了它,会不会调用sleep方法判处异常?

    package com.heiye.temp;
    
    public class SleepTest3 {
    public static void main(String[] args) throws InterruptedException {
    //创建线程
    Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
    try {
    System.out.println("child thread is in sleep");
    Thread.sleep(10000);
    System.out.println("child thread is in awaked");
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }); thread.start();
    //主线程休眠2秒
    Thread.sleep(2000);
    //主线程中断子线程
    thread.interrupt();
    }
    }

  • 子线程在睡眠期间,主线程中断了它,所以子线程在调用sleep方法会判处InterruptedException异常。

4-让线程睡眠的sleep方法的更多相关文章

  1. android里面线程睡眠事件使用方法

    SystemClock.sleep(时间); 不用Thread.sleep()的原因:要抛异常,占用资源

  2. “全栈2019”Java多线程第五章:线程睡眠sleep()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. 09_控制线程_线程睡眠sleep

    [线程睡眠] 如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态方法sleep()方法来实现. sleep()方法有两种重载形式: 1.static void ...

  4. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  5. Java中线程的使用 (2)-多线程、线程优先级、线程睡眠、让步、阻塞

    Java中线程的使用 (2)-多线程.线程优先级.线程睡眠.让步.阻塞 (一)多线程使用方法 说明:创建每个新的线程,一定要记得启动每个新的线程(调用.start()方法) class Xc3 ext ...

  6. JAVA线程sleep和wait方法区别

    一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能 ...

  7. Java中终止线程的三种方法

    终止线程一般建议采用的方法是让线程自行结束,进入Dead(死亡)状态,就是执行完run()方法.即如果想要停止一个线程的执行,就要提供某种方式让线程能够自动结束run()方法的执行.比如设置一个标志来 ...

  8. C#传递参数到线程的n个方法

    [转]http://kb.cnblogs.com/a/888688/ 本片文章的议题是有关于传递参数到线程的几种方法. 首先我们要知道什么是线程,什么时候要用到线程,如何去使用线程,如何更好的利用线程 ...

  9. java中线程池的使用方法

    1 引入线程池的原因 由于线程的生命周期中包括创建.就绪.运行.阻塞.销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建.销毁线程需要很大的 ...

随机推荐

  1. WPF---依赖属性(二)

    一.概要 我们将会通过一个简单的综合例子来阐述下依赖属性的变化. 场景:我们在一个文本框中输入一个数字,然后对应的panel中会出现对应的椭圆,椭圆的个数与输入的文本相同. 我们在MainWindow ...

  2. 互斥锁(Lock)

    转载至:https://www.cnblogs.com/dolphin0520/p/3923167.html 一.synchronized的缺陷 synchronized是java中的一个关键字,也就 ...

  3. Docker是简介

    Docker是什么  使用最广泛的开源容器引擎 一种操作系统级的虚拟化技术 依赖于Linux内核特性:Namespace(资源隔离)和Cgroups(资源限制) 一个简单的应用程序打包工具 D ...

  4. 复习git

    git 常用点,详解 from my typora 文章目录 git 常用点,详解 git 模式解析 删除文件 方式一: 方式二: 远程库 配置忽略文件 查看版本库日志,以及版本回退 解决冲突 替换我 ...

  5. mzy git学习,分支以及分支合并(四)

    git 鼓励大量使用分支:最后进行master和分支之间的合并 git branch git branch 查看当前有多少分支,并且将当前在使用的分支用*标注出来. [一定要注意git的分支有从属概念 ...

  6. 你知道 JavaScript 中的 Arguments 对象都有哪些用途吗?

    JavaScript 中 Arguments 对象的用途总结. 前言 相信我们很多人在代码开发的过程中都使用到过一个特殊的对象 -- Arguments 对象. 在实际开发中,Arguments 对象 ...

  7. RabitMq过期时间TTL

    第一种:给消息设置过期时间 启动一个插件 @Bean public DirectExchange DirectExchange() { return new DirectExchange(" ...

  8. vscode 1.32.x按下鼠标左键无法拖曳选择,而旧一点的版本1.30.2可以

    最近升级vscode后,无法通过鼠标左键选择文本,恢复到旧版本1.30.2就可以了. 另外:1.32.x和1.31.1都不正常 进一步测试发现:在中文输入法下(无论中英输入模式),都有问题:切换到纯英 ...

  9. VS Code 搭建stm32开发环境

    MCU免费开发环境 一般芯片厂家会提供各种开发IDE方案,通常其中就包括其自家的集成IDE,如: 意法半导体 STM32CubeIDE NXP Codewarrior TI CCS 另外也可以用ecl ...

  10. Java关键字-static汇总

    1.静态变量(被static修饰的成员变量) 1-静态变量 运行时,Java虚拟机只为静态变量分配一次内存(加载类的过程中完成静态变量的内存分配) 类的内部可以在任何方法内直接访问静态变量 其他类中可 ...