先问读者一个问题,如果想控制一个线程(Thread)挂起,继续,结束你会优先选择如何处理?
从面试的经验来看,多数的面试者都会说Thread不是提供了Suspend,Resume,Abort等方法吗,直接调用就好了,简单快捷.但很多情况下简单就是美只是一个谎言而已.
Suspend和Resume方法已经被MS标注过时(Obsolete),不建议用户使用,MS同时推荐通过同步控制来管理线程状态.
再问读者一个问题,如果控制一个线程池中的线程的挂起,继续,结束你会优先选择如何处理?
也许有人会说,既然没法用API了,那我定义一些标志量,来做状态控制不就可以了吗?
确实,说起来很简单.那么变量的值需不需要考虑由于多线程问题导致的读写问题呢,你会怎么处理?
如果不用标志量,可以用同步事件来做,会不会更优雅一些呢?
让我把传统的方式以及使用同步方式做的控制都写一遍,让读者来做取舍吧.
代码如下,注释也比较全,就不再累述细节.
class Program
{
static void Main(string[] args)
{
UseThreadAPI();
UseSyncEvent();
UseThreadPool();
UseSyncEventThreadPool();
Console.WriteLine("All tests finished");
Console.ReadKey();
}
/// <summary>
/// 使用标准Thread API来控制线程状态,
/// Suspend和Resume是过时的方法,MS不推荐使用
/// MS推荐的方式就是后面要提到的使用Monitor,Event等做同步控制.
/// </summary>
static void UseThreadAPI()
{
Console.WriteLine("----------Use thread API----------");
Thread t = new Thread(
new ThreadStart(() =>
{
while (true)
{
Console.WriteLine("Now Date:{0}", DateTime.Now);
Thread.Sleep(1000);
}
}
));