如何退出正在Sleep的线程

摘要:
此方法用于终止正在等待的另一个线程(睡眠/等待/加入)。事实证明,一些线程已经长时间进入睡眠状态,使程序进入不可控状态。你需要等待一定的时间(睡眠)。在特定情况下,您需要快速退出。您需要一组任务来共享快速退出信号。不难发现,通过这些信号量等待和超时更好。选择正确的信号量类型也很重要。一组任务很难共享这种快速退出信号。

    今天有个同事问我Thread的Interrupe方法,这个方法用于终止另一个正在等待(Sleep/Wait/Join)状态的线程,如果那个线程未处于等待状态,则等到下次进入等待状态时再抛出。

    这个方法的平时用的机会其实并不大,由于需要线程处于等待状态,很大程度上限制了使用的机会,因此问了下同事实际的使用场景,原来是某些线程进入了长时间的Sleep状态,而在某些情况下,可能某个任务发现可以取消其他一系列的任务时,需要尽快退出这些任务。这个时候使用Interrupe方法固然可以实现,不过显然也不太优雅,而且也更容易在未期待的地方抛异常,使程序进入不可控制的状态。

    那么更优雅,更可控制的方法是什么哪?

    结合这个业务场景,不难发现下面几个要求:

  • 需要等待一定的时间(sleep)
  • 需要在某个情况下快速退出等待
  • 需要一组任务共享这个快速退出的信号

    综合这些,不难发现通过那些信号量的等待和超时是再好不过了,不过,不同类型的信号量,其特性也有所不同。选择正确的信号量类型也很重要。

    例如在这个场景下,如果使用AutoResetEvent的话,就很难做到一组任务共享这个快速退出的信号,而使用ManualResetEvent则很容易完成。

    如何实现,或者说代码怎么写,这里就写个大概的思路:

任务组类型

私有ManualResetEvent,默认处于false状态下

公开Sleep方法,实现是调用ManualResetEvent的Wait方法,并返回bool,表示是因为时间到了而退出,还是因为收到了快速退出的信号

公开Stop方法,将ManualResetEvent的状态置为true

所有任务类型

当需要Sleep一定时间的,统一使用任务组提供的Sleep方法,并合理的处理返回值

免责声明:文章转载自《如何退出正在Sleep的线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 之 无法嵌入互操作类型(Word 或 Excel 操作)利用栈实现四则运算表达式求值----先将中缀表达式转换成后缀表达式,然后再求后缀表达式的值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浅谈银行数据仓库:数据集市建模思路 ——监管报送项目的数据集市建模实践

前言:数据集市的目标   数据集市,是数据仓库 ADM 层最主要的数据形态,应用在特定业务场景的高度汇总数据,支持特定人员或部门进行数据分析、统计、决策等行为。(数据仓库分层架构及建设思路可查阅作者的《浅谈银行数据仓库的构建之路》)概念理解起来不难,难在如何制定数据集市的落地方式,这时必须结果导向,从实现目标进行反推。 数据集市的目标   从概念可以了解,...

【Python 多进程】

" 一、模块介绍 multiprocess模快 仔细说来,multiprocess不是一个模块,而是python中的一个操作、管理进程的包,之所以叫multi是取自multiple的多功能的意思,这个包中几乎包含了和进程有关的所有子模块。 multiprocess.Process模块 Process能够帮助我们创建子进程,以及对子进程的一些控制....

unity中加载下一个场景且不销毁当前场景的方法

1. using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class TEST : MonoBehaviour {...

KVM虚拟机快照备份

KVM 快照的定义:快照就是将虚机在某一个时间点上的磁盘、内存和设备状态保存一下,以备将来之用。它包括以下几类: (1)磁盘快照:磁盘的内容(可能是虚机的全部磁盘或者部分磁盘)在某个时间点上被保存,然后可以被恢复。 磁盘数据的保存状态: 在一个运行着的系统上,一个磁盘快照很可能只是崩溃一致的(crash-consistent) 而不是完整一致(clean)...

C# WinForm获得主窗体——如何判断哪个是主窗体

一. 关于定义 主窗体的定义一般有两种。第一种就是一般上,普遍意义认为是程序中第一个被创建出来的窗体,但是由于一些程序在显示主窗体之前会有一个登录或者引导窗体,在使用完了之后直接隐藏而不是关闭。这个时候,主窗体并不会是第一个窗体。所以,第二种说法就是说,包含了软件整体功能的展示性界面所在的窗体,我们称之为主窗体。 而在本文中,所有叙述中所指的主窗体都是指的...

教会你Linux Shell自动交互的三种方法

你了解Linux系统么?你是Linux系统的应用者么?如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享一下。 一、背景 shell脚本在处理自动循环或大的任务方面可节省大量的时间,通过创建一个处理任务的命令清单,使用变量、条件、算术和循环等方法快速创建脚本以完...