首页 > 其他分享 >Thread常见方法:sleep 与 yield

Thread常见方法:sleep 与 yield

时间:2023-12-06 23:33:04浏览次数:25  
标签:Thread InterruptedException yield try while 线程 sleep wait

sleep

1. 调用 sleep 会让当前线程从 Running进入 Timed Waiting 状态(阻塞)

2. 其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException

3. 睡眠结束后的线程未必会立刻得到执行

4. 建议用 TimeUnit 的 sleep 代替 Thread 的 sleep 来获得更好的可读性

sleep应用:限制对 CPU 的使用

在没有利用 cpu 来计算时,不要让 while(true) 空转浪费 cpu,这时可以使用 yield 或 sleep 来让出 cpu 的使用权给其他程序

sleep实现
while(true) {
 try {
 Thread.sleep(50);
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
}
  • 可以用 wait 或条件变量达到类似的效果
  • 不同的是,后两种都需要加锁,并且需要相应的唤醒操作,一般适用于要进行同步的场景
  • sleep 适用于无需锁同步的场景
wait 实现
synchronized(锁对象) {
 while(条件不满足) { 
 try {
 锁对象.wait();
 } catch(InterruptedException e) {
 e.printStackTrace();
 }
 }
 // do sth...
}
条件变量实现
lock.lock();
try {
 while(条件不满足) {
 try {
 条件变量.await();
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 }
 // do sth...
} finally {
 lock.unlock();
}


yield

1. 调用 yield 会让当前线程从 Running 进入 Runnable就绪状态,然后调度执行其它线程

2. 具体的实现依赖于操作系统的任务调度器

标签:Thread,InterruptedException,yield,try,while,线程,sleep,wait
From: https://blog.51cto.com/AmbitionGarden/8711945

相关文章

  • Thread介绍与原理分析
    TheadLocal介绍及用法ThreadLocal是线程的本地变量。当使用ThreadLocal维护变量时,它为每个线程提供独立的变量副本。每一个线程可以独立地操作自己的变量,不受其他线程影响。使用场景作为数据副本,当某些数据是以线程为作用域并且不同线程有不同数据副本,使用ThreadLocal。保存......
  • C2 CompilerThread9 长时间占用CPU解决方案
    一、问题描述近期在进行日常巡检时发现,线上部分应用服务器的CPU突然比以往高出很多,经过登录机器排查确认是C2CompilerThread9线程始终长时间运行消耗了CPU。排查步骤在上篇博文有记录总结,地址:排查CPU异常步骤_u012538947的专栏-CSDN博客_cpu异常异常线程的堆栈如下:"C2Compile......
  • RT Thread中配置AD7190
    ​详见RTThread中配置AD7190-CSDN博客 ​编辑使用前先复位操作1SCL空闲时会高电平。2复位:上电后连续输入40个1(时钟周期)复位到已知状态,并等待500us后才能访问串行接口,用于SCLK噪音导致的同步。​编辑voidAD7190_Reset(void){spi_dev_ad7190=(structrt_spi_devi......
  • 应用报错:java.lang.OutOfMemoryError: unable to create new native thread
    上个月生产环境忽然出现部分交易处理缓慢甚至超时,查看对应应用日志发现一直在刷报错日志,报错信息如下java.lang.OutOfMemoryError:unabletocreatenewnativethread从报错上来看是说不能创建本地线程了,应用都是容器部署的,开始我怀疑是容器内存不够了导致内存泄露,但经过查看容器......
  • ThreadLocal的深度解读
    原文链接:https://zhuanlan.zhihu.com/p/624851777一、J2SE的原始描述Thisclassprovidesthread-localvariables.Thesevariablesdifferfromtheirnormalcounterpartsinthateachthreadthataccessesone(viaitsgetorsetmethod)hasitsown,independentlyin......
  • 基于DigiThread的仿真模型调参功能
    仿真模型调参是指通过调整模型内部的参数值,使仿真模型的输出更符合实际系统的行为或者预期结果的过程。仿真过程中,往往需要频繁对模型参数进行调整,通过观察不同参数下系统整体的运行情况,实现系统的性能、可靠性和效率的优化。在进行模型调参时,需要注意选择合适的调参方法和调参参......
  • Qt结合QThread创建一个QWidget基类,用于方便的在QWidget中执行耗时任务
    一、概述背景:Qt+OpenCV项目改造,之前项目中的OpenCV算法都是在主线程中执行,导致部分操作或者重复点击的时候界面卡顿。现在想对这块进行改造。集合QThread和QWidget设计一个QWidget基类用于方便的执行耗时任务并显示执行结果。子类只需要继承这个QWidget基类,只需......
  • ThreadPoolExecutor线程池内部处理浅析
    我们知道如果程序中并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束时,会因为频繁创建线程而大大降低系统的效率,因此出现了线程池的使用方式,它可以提前创建好线程来执行任务。本文主要通过java的ThreadPoolExecutor来查看线程池的内部处理过程。1ThreadPoolExec......
  • C++ 11 关键字:thread_local
    thread_local是C++11新引入的一种存储类型,它会影响变量的存储周期。C++中有4种存储周期:automaticstaticdynamicthread有且只有thread_local关键字修饰的变量具有线程(thread)周期,这些变量在线程开始的时候被生成,在线程结束的时候被销毁,并且每一个线程都拥有一个独......
  • 处理挖矿病毒kthreaddk的过程
    问题描述发现服务器的CPU和内存占用非常高,然后看了一下发现有几个异常的程序PIDUSERPRNIVIRTRESSHRS%CPU%MEMTIME+COMMAND12043root......