多线程随笔一(AutoResetEvent和ManulResetEvent)

  AutoResetEvent和ManulResetEvent是.net中用来做线程的同步的两个类。从类名上不难看出,这两个类的区别在于一个是自动的,一个是手动的(这不是废话嘛)。两个类的实现原理大致相同,主要是初始化类对象的时候,设置一个状态位,通过判断这个状态位,决定代码是继续执行还是等待。

  常用的方法有以下四个:

1. AutoResetEvent(Boolean)

  构造函数,MSDN的解释为Initializes a new instance of the AutoResetEvent class with a Boolean value indicating whether to set the initial state to signaled.

  通过一个Bool值设置初始的信号状态(true为已接收到信号,false为未接收到信号)。

  2. Reset()

    MSDN的解释为Sets the state of the event to nonsignaled, causing threads to block.

    设置状态为未接收到信号,引起线程阻塞。

  3. Set()

    MSDN的解释为Sets the state of the event to signaled, allowing one or more waiting threads to proceed.

    设置状态为已接收到信号,该状态下线程能正常执行。

  4. WaitOne():

    MSDN的解释为Blocks the current thread until the current WaitHandle receives a signal.

    阻塞当前线程,知道接收到信号。

看了这三个方法的解释,就不难理解这几个方法的用途。通过调用WaitOne方法,阻塞当前线程,判断状态位,如果状态为已接收到信号(初始化为true或调用Set方法),继续执行后续代码,否则(初始化为false或调用Reset方法),等待直到信号状态变为已接收到信号。那么AutoResetEvent和ManulResetEvent在使用上有什么区别呢?其实区别很简单,AutoResetEvent在每次调用WaitOne通过之后,都会调用Reset,将状态置为未接收到信号状态,引起其他WaitOne的阻塞,而ManulResetEvent则不会这么做。类似于AutoResetEvent通过一个后就把闸机关上了,ManulResetEvent则一直保持畅通状态。

第一次写博客,关于AutoResetEvent和ManulResetEvent的内容先写到这,之后再补上Thread,Task等内容。

上一篇:Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)


下一篇:写作技巧--Simile明喻