线程挂起和恢复的几种方法

线程挂起和恢复的几种方法,第1张

线程的挂起与恢复,不推荐使用Thread..::.Suspend

和Thread..::.Resume方法。你可以通过AutoResetEvent

来控制挂起和恢复,用Sleep来暂停线程执行。

AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独谈厅占访问的资源。

线程通过调用 AutoResetEvent 上的

WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程

通过调用 Set 发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态做败为终止状态,则为

true;否则为 false。

通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会Set是发信号,WaitOne是等待信号,只有发了信号,

等待的才会执行。如果不发的话,WaitOne后面的程序就永远纯侍颤不会执行。

class Class1

{

public static bool ok = false

static AutoResetEvent are = new AutoResetEvent(false)

public void add() {

while(true){

if (ok)

{

Console.WriteLine("你好")

Thread.Sleep(1000)

}

else {

Console.WriteLine("我等待")

are.WaitOne()

}

}

}

public static void begin(){

ok = true

are.Set()

}

public static void end()

{

ok = false

}

}

class Program

{

public static void Main(String[] args) {

Thread t = new Thread(new ThreadStart(new Class1().add))

Thread.CurrentThread.Name = "主线程"

t.Start()

t.Name = "Class1线程"

for (int i = 0i <10i++ )

{

Console.WriteLine(i)

Thread.Sleep(1000)

}

Class1.begin()

for (int i = 0i <10i++)

{

Console.WriteLine(i)

Thread.Sleep(1000)

}

Class1.end()

t.Abort()

Console.WriteLine(t.Name + "状态:" + t.ThreadState)

Console.ReadLine()

}

}

第一个控制台程序运行时,m是有信号的,因此m.WaitOne(TimeSpan.FromSeconds(5),false)会立即返回true,if的测试条件为false(因为!true为false),会执行else部分,同时m变成无信号;

第明贺二个控制台程序运行时,因为m是命名互斥体对象(可用于系统中的进程或线程同步),如果第一个控制台程序还没有运行过m.ReleaseMutex()语句(作用是使m变成有信号),则第二个控制台程序执行m.WaitOne(TimeSpan.FromSeconds(5),false)时,会阻塞5秒以等待m变成有信碰槐租号,如果第一个控制台程序没有在5秒内执行m.ReleaseMutex()语句,则第二个控制台程序会因等不到笑兆信号,导致m.WaitOne(TimeSpan.FromSeconds(5),false)5秒超时返回,会返回false,因此第二个控制台程序会执行if部分(因为!false为true)。

MSDN关于第二个参数的描述为:

------------

exitContext 类型:System.Boolean

如果等待之前先退出上下文的同步域(如果在同步上下文中),并在稍后重新获取它,则为 true;否则为 false

------------

1)同步上下文的概念:

同步上下文(synchronization context)禅脊概念简单解释如下:

为了实现同步,在编程时需要若干野渣对象共同使用(share)一把锁。这可以通过给类添加[Synchronization()]属性实现。例如,类A和类B就可以同用一个锁:

[Synchronization()]

public class A{ ……}

[Synchronization()]

public class B{ ……}

这样,类A和类B构成了一个“同步上下文”

2)同步上下文的排他特性

要使用同步上颂袭悄下文中的对象,必须首先要获得锁。一但获得了锁,将阻止其他代码使用同步上下文中的对象。这就是同步上下文的排他特性。

3)假设在一个多线程环境中,线程A和线程B都会用到上面提到同步上下文中的对象。

//在线程A中

WaitOne(1000, false)

线程A在等待且在超时时间到期前一直阻止其他线程(如线程B)对同步上下文对象的访问!

//在线程B中

WaitOne(1000, true)

线程B在等待且在超时时间到期前,将允许其他线程(如线程A)对同步上下文对象的访问!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12321988.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存