多线程-线程休眠(sleep)

Java中的线程休眠大法系列(一)Thread.sleep() 文章目录前言Thread.sleep()1.看看JDK中此方法上面的注释2.案例展示(线程状态:TIMED_WAITING)3.案例展示(InterruptedException异常会清除interrupted status)4.案例展示(sleep不会释放monitors锁)总结 前言 如果让一个线程进入休眠? 我们第一个想到的就是Thread.sleep(long millis)方法吧! 如果你对synchronized足够了解的话,那么你肯定还能想到Object.wait()方法。 再如果你对jav 阅读详情

1. sleep()介绍

sleep() 定义在Thread.java中。
sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。

 

2. sleep()示例

下面通过一个简单示例演示sleep()的用法。

 //SleepTest.java的源码
  class ThreadA extends Thread{
      public ThreadA(String name){ 
          super(name); 
      } 
      public synchronized void run() { 
          try {
              for(int i=0; i <10; i++){ 
                  System.out.printf("%s: %d\n", this.getName(), i); 
                 // i能被4整除时,休眠100毫秒
                 if (i%4 == 0)
                     Thread.sleep(100);
             } 
         } catch (InterruptedException e) {
             e.printStackTrace();
         }
     } 
 } 
 
 public class SleepTest{ 
     public static void main(String[] args){ 
         ThreadA t1 = new ThreadA("t1"); 
         t1.start(); 
     } 
 } 
  

运行结果:

 

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9

结果说明:
程序比较简单,在主线程main中启动线程t1。t1启动之后,当t1中的计算i能被4整除时,t1会通过Thread.sleep(100)休眠100毫秒。

 

3. sleep() 与 wait()的比较

我们知道,wait()的作用是让当前线程由“运行状态”进入“等待(阻塞)状态”的同时,也会释放同步锁。而sleep()的作用是也是让当前线程由“运行状态”进入到“休眠(阻塞)状态”。
但是,wait()会释放对象的同步锁,而sleep()则不会释放锁。
下面通过示例演示sleep()是不会释放锁的。

  // SleepLockTest.java的源码
  public class SleepLockTest{ 
  
      private static Object obj = new Object();
  
      public static void main(String[] args){ 
          ThreadA t1 = new ThreadA("t1"); 
          ThreadA t2 = new ThreadA("t2"); 
          t1.start(); 
         t2.start();
     } 
 
     static class ThreadA extends Thread{
         public ThreadA(String name){ 
             super(name); 
         } 
         public void run(){ 
             // 获取obj对象的同步锁
             synchronized (obj) {
                 try {
                     for(int i=0; i <10; i++){ 
                         System.out.printf("%s: %d\n", this.getName(), i); 
                         // i能被4整除时,休眠100毫秒
                         if (i%4 == 0)
                             Thread.sleep(100);
                     }
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         } 
     } 
 } 
 

运行结果:

t1: 0
t1: 1
t1: 2
t1: 3
t1: 4
t1: 5
t1: 6
t1: 7
t1: 8
t1: 9
t2: 0
t2: 1
t2: 2
t2: 3
t2: 4
t2: 5
t2: 6
t2: 7
t2: 8
t2: 9
 

结果说明:
主线程main中启动了两个线程t1和t2。t1和t2在run()会引用同一个对象的同步锁,即synchronized(obj)。在t1运行过程中,虽然它会调用Thread.sleep(100);但是,t2是不会获取cpu执行权的。因为,t1并没有释放“obj所持有的同步锁”!
注意,若我们注释掉synchronized (obj)后再次执行该程序,t1和t2是可以相互切换的。下面是注释调synchronized(obj) 之后的源码:

  // SleepLockTest.java的源码(注释掉synchronized(obj))
  public class SleepLockTest{ 
  
      private static Object obj = new Object();
  
      public static void main(String[] args){ 
          ThreadA t1 = new ThreadA("t1"); 
          ThreadA t2 = new ThreadA("t2"); 
          t1.start(); 
         t2.start();
     } 
 
     static class ThreadA extends Thread{
         public ThreadA(String name){ 
             super(name); 
         } 
         public void run(){ 
             // 获取obj对象的同步锁
 //            synchronized (obj) {
                 try {
                     for(int i=0; i <10; i++){ 
                         System.out.printf("%s: %d\n", this.getName(), i); 
                         // i能被4整除时,休眠100毫秒
                         if (i%4 == 0)
                             Thread.sleep(100);
                     }
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
 //            }
         } 
     } 
 } 
 
深入理解 sleep() 和 wait():线程控制的两种核心方法 在多线程编程中,线程的控制和协调是至关重要的。Java 提供了多种方法来管理线程的执行,其中最常用的两个方法是 sleep() 和 wait()。虽然它们都可以让线程暂停执行,但它们的使用场景、底层机制和影响却截然不同。本文将深入探讨这两个方法的区别,并结合实际代码示例,帮助读者理解何时使用 sleep(),何时使用 wait()。 阅读详情

相关推荐

【多线程】线程休眠(Thread Sleep)的底层实现

线程休眠的底层实现涉及从用户态到内核态的复杂交互。其核心是将线程从就绪队列移入等待队列,主动让出CPU。当休眠条件满足时,线程被重新放回就绪队列。具体实现包括:编程语言层调用本地方法,操作系统层通过系统调用(如nanosleep)设置线程状态、启动定时器并加入等待队列,硬件层依赖高精度时钟源和中断机制实现精确唤醒。整个过程涉及线程状态切换(RUNNING→SLEEPING→RUNNING)和内核调度机制,确保休眠期间不消耗CPU资源。

guigenyi的专栏 1049

Java多线程系列--“基础篇”07之 线程休眠

概要 本章,会对Thread中sleep()方法进行介绍。涉及到的内容包括:1. sleep()介绍2. sleep()示例3. sleep() 与 wait()的比较 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479256.html 1. sleep()介绍 sleep() 定义在Thread.java中。sleep() 的作用是...

weixin_30443813的博客 907

多线程之休眠当前线程sleep/TimeUnit

休眠线程有两种实现: 使⽤ sleep 休眠和使⽤ TimeUnit 休眠。2.使⽤ TimeUnit 休眠。1.使⽤ sleep 休眠。

gaoyu0914的博客 450

线程休眠,礼让

线程休眠,礼让 线程休眠 sleep(时间)指定当前线程阻塞的毫米值 sleep存在异常InterruptedException; sleep时间达到后线程进入就绪状态 sleep可以模拟网络延迟(就是在run方法中加一个sleep方法就可以了),倒计时等 每一个对象都有一个锁,sleep不会释放锁; package com.Jinone.www; import java.text.SimpleDateFormat; import java.util.Date; public class TextS

weixin_45970171的博客 894

c++多线程(3)------休眠函数sleep_for和sleep_until

这两个函数都定义在 <thread> 头文件中,属于 std::this_thread 命名空间,用于让当前线程暂停执行一段时间。

jndingxin的专栏 1274

线程休眠 (sleep)

上一篇:从Java线程到kotlin协程之线程的状态 上一篇在看线程状态的时候我们用到了线程的几个方法例如: sleep join 实际上,这些方法就是对线程的调度(scheduled) 本篇文章,我们先来看看简单看看线程的调度: Sleep 线程休眠 线程休眠 ...

喻志强的博客 5838

java多线程之休眠(sleep)

多线程之休眠(sleep()) sleep()方法会使当前线程由运行状态进入到休眠(阻塞)状态同时让出CPU资源,休眠结束后,就会由阻塞状态变为就绪状态,竞争CPU资源,整个过程都会持有对象锁 private static List obj = new ArrayList&amp;lt;&amp;gt;(10); @Override public void run() { s...

weixin_38040972的博客 2728

windows10下Boost的安装与初试

https://blog.youkuaiyun.com/s_lisheng/article/details/72871218 https://blog.youkuaiyun.com/yockie/article/details/8856190?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-12.vipsorttest&depth_1-utm_source=dis

焦露的博客 6397

10、多线程:线程休眠——sleep

学习过程观看视频:[狂神说Java] https://www.bilibili.com/video/BV1V4411p7EF?p=3 欢迎大家支持噢,很良心的老师了! java代码示例—10秒倒计时案例 package com.zjl; /** * Created by zjl * 2020/11/17 **/ public class TestSleep { public static void main(String[] args) throws InterruptedExcepti

Garry 935

基于Playwright的雪球网股票情绪数据自动化采集实战

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理在于模拟浏览器行为或直接发送HTTP请求以解析网页内容。在金融科技与量化分析领域,实时、稳定的数据源具有极高的技术价值,能够为市场情绪分析、因子挖掘提供基础。面对采用动态加载、复杂反爬机制的现代单页应用,传统的请求库与Selenium方案在稳定性与隐蔽性上面临挑战。本文聚焦于利用Playwright这一现代浏览器自动化工具,通过模拟真实用户交互、监听网络请求,构建一个能够稳定采集雪球社区实时讨论热度的解决方案。该方案不仅解决了动态内容渲染问题,还通过请

weixin_42529328的博客 585

《童虎学习笔记》5分钟用Keepalived搭建MySQL高可用实现虚ip自动漂移

1

tonghu_note的博客 5618

Java多线程的两种休眠sleep()和wait()

Java多线程的两种休眠 文章目录Java多线程的两种休眠前言一、sleep()方法二、wait()方法三、线程状态图 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、sleep()方法 自我休眠,自我唤醒(休眠时间到后自我苏醒)。 每一个对象都有一把锁,sleep不会释放锁。 public class Thread01 exten

mengxin_chen的博客 1381

【YOLOv12多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1213

java thread sleep 效率_Java多线程-线程的调度(休眠)

Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。这里要明确的一点,不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。线程休眠的目的是使线程让出CPU的最简单的做法之一,线程休眠时候,会将CPU资源交给其他线程,以便能轮换执行,当休眠一定时间后,线程会苏醒,进入准备状态等待执行。线程休眠的方法是Thread.sleep(...

weixin_42382748的博客 501

概率的接力:拆解大模型“预测下一个词“的底层逻辑

大模型的智能不在于它拥有了意识,而在于它用纯数学的架构,将人类语言的复杂结构压缩为可计算的向量轨迹与概率接力。当我们不再将其拟人化为"思考者",而是视作高维条件概率引擎时,才能真正驾驭它。预测下一个词,从来不是终点,而是起点。未来的核心竞争力,属于那些能洞察其统计本质、善用其模式生成能力,并以人类理性与事实为锚点的协作者。词元的轨迹终会止步于上下文窗口,但对技术底层的清醒认知,才是跨越幻觉、走向真实智能的基石。

AI浩 333

【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比

文章目录2.1 使用VBA进行桌面软件开发2.1.1 VBA开发方式2.1.1 VBA代码的安全性2.2 使用DLL进行桌面软件开发2.2.1 DLL开发方式2.2.2 DLL功能的应用部署2.3 使用Add-in进行桌面软件开发2.4 使用ArcGIS Engine构建独立应用程序 对于桌面GIS应用来说,ArcGIS平台不仅提供了用于开发独立运行的GIS应用软件的二次开发工包ArcGIS Engine,还提供了对ArcGIS Deskop桌面软件进行扩展的开发的话,在开发个具体的GIS 行业应用软件时

智慧空间实验室 6510

Java多线程-sleep线程休眠

线程休眠 pulibc static void sleep(long time): 让线程按指定时间休眠, 单位为毫秒 因为是静态方法,所以可以通过Thread.sleep()调用

cmy_top的博客 231

FM1288回声消除芯片调试方案 - 综述

专栏文章概览

优快云mianfeixiazai001的博客 1714

thread.sleep是让哪个线程休眠_JAVA多线程看这一篇就足够了(超详细总结)

前言多线程编程,是 “多核时代” 提升计算性能的关键因素之一,亦属于开发者必须掌握的核心技能。本片文章小编带你从六个知识点剖析JAVA多线程,将针对于 Java 多线程编程,进行基础的阐述!主要内容包括:一、概述二、Thread 类三、创建线程:继承 Thread 类四、创建线程:实现 Runnable 接口五、线程优先级六、线程的生命周期七、同步代码块一、概述1. 进程和线程进程:进程指正在运行...

weixin_39663605的博客 4227

ardupilot BMI088加速度陀螺仪学习

本节主要记录ardupilot 中BMI088传感器的学习过程,欢迎批评指正。BMI088是一款高性能6轴惯性传感器,由16位数字三轴±24g加速度计和16位数字三轴±2000°/ s陀螺仪组成。 BMI088允许高精度测量方向和沿三个正交轴的运动检测。BMI088具有高振动鲁棒性和3 x 4.5 x0.95mm³的小尺寸,是用于无人机和机器人应用等恶劣环境的高性能IMU中的独特产品。 BMI088专门设计用于有效抑制由于PCB上的共振或整个系统的结构而可能发生的振动。 除了高振动稳定性外,BMI088的出

陌城烟雨 2057

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++线程休眠:从sleep_for到高精度定时,多线程与游戏循环实战

线程休眠是操作系统与并发编程中的基础概念,指线程主动暂停执行并让出CPU资源。其核心原理是通过系统调用将线程置于阻塞状态,由内核调度器在指定时间后重新唤醒。这一机制的技术价值在于实现可控的程序节奏、协调多线程执行顺序、降低CPU空转功耗。在应用场景上,它广泛用于游戏循环的帧率控制、网络请求的礼貌间隔、生产者-消费者模型的速率限制等。本文聚焦C++中的休眠实现,深入解析std::this_thread::sleep_for的跨平台优势与精度局限,并探讨在游戏主循环和多线程同步中如何避免忙等待陷阱。针对高精度需

weixin_30225755的博客 267

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java进阶之多线程:线程休眠(sleep)+ 线程礼让(yield)

学习狂神的第五天 Java进阶之多线程:线程休眠(sleep) 文章目录学习狂神的第五天前言一、线程休眠(sleep)二、使用步骤1.在线程中直接调用sleep2.结果 前言 今天我们来水一下线程休眠 线程休眠,目前我的认知,仅仅用于放大问题的发生性。 下面直接开始水。 一、线程休眠(sleep) 我们直接来写一个打印当前系统时间的程序,来演示一下模拟网络延时。 我们模拟1000ms输出一次。 二、使用步骤 1.在线程中直接调用sleep 方法很简单 import java.sql.Date; i

Linux467的博客 356

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java多线程-sleep()线程休眠

一)sleep()简介 static voidsleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 static voidsleep(long millis, int nanos):使正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),具体取决于系统定时器和调度器的精度和准确性。 ...

p812438109的专栏 5847

玩转java多线程 之多线程基础 线程休眠 sleep

线程休眠: sleep时间指定当前线程阻塞的毫秒数 sleep存在异常 InterruptedException sleep时间达到线程后线程进入就绪状态 sleep可以模拟网络延时,倒计时等 每一个对象都有一个锁,sleep不会释放锁 模拟网络延时,可以放大问题的发生性 比如之前买票的例子: package duoxiancheng; //模拟网络延时 public class TestSleep implements Runnable{ //票数 private int ticket

weixin_45806131的博客 210

C#之多线程与 Thread.Sleep休眠

C#提供了丰富的多线程编程工具,从传统的Thread类到现代的和模式。关键要点选择正确的工具ThreadPool或Task.RunMonitorMutexSemaphore同步策略优先使用不可变数据必须共享时使用线程安全集合临界区尽可能小考虑使用lock或类现代C#多线程是异步编程的首选方式ValueTask可以减少分配(高频率场景)Channel提供线程安全的生产者-消费者队列调试与优化使用性能分析器识别瓶颈监控线程创建和上下文切换考虑使用调整并行度。

Major_S的博客 2075

java 线程休眠 30秒_Java 多线程基础(七)线程休眠 sleep

Java 多线程基础(七)线程休眠 sleep一、线程休眠 sleepsleep() 方法定义在Thread.java中,是 static 修饰的静态方法。sleep() 的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。...

weixin_35318343的博客 3939
上一篇: 多线程-线程让步(yield)
下一篇: 多线程-线程等待 (join)
Mark_XC
博客等级 码龄9年 16粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值