c# WaitSleepJoin状态的线程如何自动恢复

在 C# 中,线程的 ThreadState.WaitSleepJoin 状态表示线程当前处于等待、睡眠或加入(比如等待锁、等待事件、或者调用 Thread.Sleep 等)。要让一个处于 WaitSleepJoin 状态的线程恢复运行,必须唤醒它或让它不再被阻塞。这通常通过以下几种方式实现:

1. 使用 Monitor.PulseMonitor.PulseAll

如果线程因为 Monitor.Waitlock 等机制而进入等待状态,可以使用 Monitor.PulseMonitor.PulseAll 来唤醒一个或所有等待的线程。

示例:使用 Monitor 来管理线程的等待和唤醒
using System;
using System.Threading;class Program
{private static object _lock = new object();static void Main(){Thread thread = new Thread(WaitingThread);thread.Start();// 主线程睡眠 1 秒钟,然后唤醒等待线程Thread.Sleep(1000);lock (_lock){Console.WriteLine("主线程正在唤醒等待线程");Monitor.Pulse(_lock); // 唤醒一个等待线程}thread.Join(); // 等待子线程结束}static void WaitingThread(){lock (_lock){Console.WriteLine("等待线程正在等待...");Monitor.Wait(_lock); // 使线程进入等待状态Console.WriteLine("等待线程被唤醒");}}
}

在上述代码中,WaitingThread 线程调用 Monitor.Wait 进入 WaitSleepJoin 状态,主线程通过 Monitor.Pulse 唤醒它,恢复线程执行。

2. 使用 ManualResetEventAutoResetEvent

ManualResetEventAutoResetEvent 是两种常用的同步事件,它们可以用于线程间的协调。你可以使用这些类的 Set 方法来唤醒一个或多个等待线程。

  • AutoResetEvent:每次唤醒一个等待线程后,会自动重置为无信号状态。
  • ManualResetEvent:唤醒后需要手动重置,直到调用 Reset
示例:使用 AutoResetEvent
using System;
using System.Threading;class Program
{private static AutoResetEvent _autoResetEvent = new AutoResetEvent(false);static void Main(){Thread thread = new Thread(WaitingThread);thread.Start();// 主线程睡眠 1 秒钟,然后唤醒等待线程Thread.Sleep(1000);Console.WriteLine("主线程正在唤醒等待线程");_autoResetEvent.Set(); // 唤醒等待线程thread.Join(); // 等待子线程结束}static void WaitingThread(){Console.WriteLine("等待线程正在等待...");_autoResetEvent.WaitOne(); // 线程在此等待直到被唤醒Console.WriteLine("等待线程被唤醒");}
}

在上述代码中,WaitingThread 线程调用 _autoResetEvent.WaitOne() 进入等待状态,主线程通过调用 _autoResetEvent.Set() 唤醒它。

3. 使用 Thread.Sleep

如果线程处于 Thread.Sleep 状态(也是 WaitSleepJoin 状态的一种),它会在设定的时间到达后自动恢复。调用 Thread.Sleep 后的线程会在指定的时间过后继续执行,自动恢复。

示例:使用 Thread.Sleep
using System;
using System.Threading;class Program
{static void Main(){Thread thread = new Thread(WaitingThread);thread.Start();// 主线程睡眠 1 秒钟Thread.Sleep(1000);thread.Join(); // 等待子线程结束}static void WaitingThread(){Console.WriteLine("等待线程正在睡眠...");Thread.Sleep(2000); // 线程睡眠 2 秒Console.WriteLine("等待线程被唤醒");}
}

在上述代码中,WaitingThread 线程调用 Thread.Sleep(2000) 进入等待状态。线程会在 2 秒后自动恢复并继续执行。

4. 使用 Task 类的异步操作

在现代 C# 开发中,使用 Taskasync/await 模式来处理线程等待和恢复是更常见的做法。Task.Delay 使得线程可以在异步等待期间不阻塞主线程。

示例:使用 Task.Delay(异步)
using System;
using System.Threading.Tasks;class Program
{static async Task Main(){Task task = WaitingTask();// 主线程继续执行其他操作await Task.Delay(1000); // 主线程延时 1 秒await task; // 等待任务完成}static async Task WaitingTask(){Console.WriteLine("等待任务正在等待...");await Task.Delay(2000); // 异步等待 2 秒Console.WriteLine("等待任务被唤醒");}
}

在此代码中,WaitingTask 异步任务使用 Task.Delay(2000) 进入等待状态,自动恢复。

总结

要让处于 WaitSleepJoin 状态的线程恢复,可以根据实际情况选择不同的同步机制:

  1. 使用 Monitor.PulseMonitor.PulseAll:用于 lock 语句块中,通过唤醒等待的线程。
  2. 使用 AutoResetEventManualResetEvent:线程等待这些事件的信号来恢复。
  3. 使用 Thread.Sleep:线程会在指定时间后自动恢复执行。
  4. 使用 Task.Delay:异步任务会在指定时间后自动恢复。

通常,现代 C# 开发推荐使用 Taskasync/await 模式来避免复杂的线程管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497876.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Debian安装ClamAV和命令行扫描病毒方法,以及用Linux Shell编写了一个批量扫描病毒的脚本

ClamAV是一个开源的跨平台病毒扫描引擎,用于检测恶意软件、病毒、木马等安全威胁。 一、Linux Debian安装ClamAV 在Linux Debian系统上安装ClamAV,你可以按照以下步骤进行: 更新软件包列表: 打开终端并更新你的软件包列表&#…

VSCode outline显示异常的解决方法——清除VSCode的配置和用户文件

1. 删除所有配置文件 sudo apt remove --purge code2. 删除所有用户文件 rm -rf ~/.config/Code rm -rf ~/.vscode rm -rf ~/.local/share/code rm -rf ~/.cache/Code3. 重装Code sudo dpkg -i code_1.96.2-1734607745_amd64.deb如此,可修复异常导致的outline无…

Crawler实现英语单词的翻译

首先声明一点,这种方法仅限于低频次的交互来获取翻译信息,一旦一秒内大量的请求会被重定向,那就直接不能用了 如果希望可以批量查询英语单词翻译,可以查看我的下一篇博客。 接下来的任务就是要把这么一大堆的单词进行翻译&#xf…

QT 学习第十四天 QWidget布局

QT 学习十四天 布局 布局管理Qt Widgets 布局布局管理器简介基本布局管理器栅格布局管理器窗体布局管理器综合使用布局管理器设置部件大小可扩展窗口 布局管理 今天讲 Qt Widgets 和 Qt Quick 中的布局。 前者主要用布局管理器 后者除了布局管理器还有基于锚的布局&#xff08…

jangow靶机

打开靶机,打开kali,有的人会发现扫不到靶机的ip 在网上搜索了半天,发现是靶机的网卡配置有问题 重启靶机,选第二个 进去后再选第二个,按e 找到ro这一行 把ro后面这一行的内容都替换成ro rw signin init/bin/bash ctr…

redis开发与运维-redis0401-补充-redis流水线与Jedis执行流水线

文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

KOI技术-事件驱动编程(Sping后端)

1 “你日渐平庸,甘于平庸,将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的,那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人,和他们斗了那么久,最终却要变得和他们一样,…

小程序配置文件 —— 14 全局配置 - tabbar配置

全局配置 - tabBar配置 tabBar 字段:定义小程序顶部、底部 tab 栏,用以实现页面之间的快速切换;可以通过 tabBar 配置项指定 tab 栏的表现,以及 tab 切换时显示的对应页面; 在上面图中,标注了一些 tabBar …

小程序基础 —— 08 文件和目录结构

文件和目录结构 一个完整的小程序项目由两部分组成:主体文件、页面文件: 主体文件:全局文件,能够作用于整个小程序,影响小程序的每个页面,主体文件必须放到项目的根目录下; 主体文件由三部分组…

使用ArcGIS/ArcGIS pro绘制六边形/三角形/菱形渔网图

在做一些尺度分析时,经常会涉及到对研究区构建不同尺度的渔网进行分析,渔网的形状通常为规则四边形。构建渔网的方法也很简单,使用ArcGIS/ArcGIS Pro工具箱中的【创建渔网/CreateFishnet】工具来构建。但如果想构建其他形状渔网进行相关分析&…

【K8S问题系列 | 21 】K8S中如果PV处于Bound状态,如何删除?【已解决】

在Kubernetes(K8S)的存储管理体系中,持久卷(PersistentVolume,PV)是一种重要的资源,它为Pod提供了持久化存储能力。当PV处于Bound状态时,意味着它已经与某个持久卷声明(P…

旅游管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

Qt5 中 QGroupBox 标题下沉问题解决

我们设置了QGroupBox 样式之后,发现标题下沉了,那么如何解决呢? QGroupBox {font: 12pt "微软雅黑";color:white;border:1px solid white;border-radius:6px; } 解决后的效果 下面是解决方法: QGroupBox {font: 12pt "微软雅黑";color:white;bo…

六大基础深度神经网络之CNN

左侧是传统卷积网络输入的是一列像素点,右侧是卷积神经网络,输入的是具有长宽通道数的原始图像 下图为整体架构。卷积层可以认为提取特征,池化层是压缩特征。全连接层是把图像展平然后计算10个类别的概率值 给出一张图像不同区域的特征不同&a…

抽象工厂设计模式的理解和实践

在软件开发中,设计模式是前人通过大量实践总结出的、可复用的、解决特定问题的设计方案。它们为我们提供了一种标准化的解决方案,使得代码更加简洁、灵活和易于维护。在众多设计模式中,抽象工厂模式(Abstract Factory Pattern&…

从入门到精通:Vim 高效文本编辑全面指南

文章目录 前言🧬一、Vim 的编辑哲学:模式分离与高效键盘操作🧬二、基础命令与快捷键:从简单到熟悉🧬三、进阶功能:多文件、分屏与可视化模式🧬四、自定义配置与 .vimrc:打造你的专属…

大模型-ChatGLM2-6B模型部署与微调记录

大模型-ChatGLM2-6B模型部署与微调记录 模型权重下载: 登录魔塔社区:https://modelscope.cn/models/ZhipuAI/chatglm2-6b 拷贝以下代码执行后,便可快速权重下载到本地 # 备注:最新模型版本要求modelscope > 1.9.0 # pip insta…

连锁餐饮行业数据可视化分析方案

引言 随着连锁餐饮行业的迅速发展,市场竞争日益激烈。企业需要更加精准地把握运营状况、消费者需求和市场趋势,以制定科学合理的决策,提升竞争力和盈利能力。可视化数据分析可以帮助连锁餐饮企业整合多源数据,通过直观、动态的可…

NiChart 多模态神经影像(structural MRI,functional MRI,and diffusion MRI)处理和分析工具包安装

NiChart多模态神经影像部署 NiChart 本地安装Git clone 问题personal access token PAT 问题 NiChart 云端注册AWS验证问题 NiChart 是UPenn大学,Christos Davatzikos教授开发的一个多模态MRI影像,structural (sMRI), diffusion (dMRI), and …

人工智能与云计算的结合:如何释放数据的无限潜力?

引言:数据时代的契机 在当今数字化社会,数据已成为推动经济与技术发展的核心资源,被誉为“21世纪的石油”。从个人消费行为到企业运营决策,再到城市管理与国家治理,每个环节都在生成和积累海量数据。然而,数…