代码改变世界

Thead.Join()和Thread.Sleep()

2010-12-30 23:04  dytes  阅读(1866)  评论(0编辑  收藏  举报

Thead.Join()和Thread.Sleep()


C#中Thread类包含的两个常用方法:实例方法Join()和静态方法Sleep(),对于Join()的使用以及和Sleep()的区别一直比较迷糊,小结一下。

Thread.Join()
阻塞调用线程,直至某个线程终止。在此期间,被阻塞线程继续执行标准的COM和SendMessage消息泵。该方法使线程状态包含ThreadState.SleepWaitJoin.

该方法可以用来确认某个线程是否结束。如果线程已经结束,则该方法立即返回,否则阻塞直至线程结束。在某些需要等待其他线程执行结束后,继续后续操作时,可以使用该方法。
该方法有2个带参的重载方法,可以指定阻塞的时间。超时或者线程结束时,该方法将返回。

Thread.Sleep(int milliSec)
在指定的时间段内挂起当前线程。此期间不执行的COM和SendMessage消息泵,也不会被系统调度并执行。该方法使线程状态包含ThreadState.SleepWaitJoin.

测试代码
using System;
using System.Threading;

public class SleepJoin
{
    public static void Main()
    {
        Console.WriteLine("MainThread[" + Thread.CurrentThread.ManagedThreadId + "]");
        Thread newThread = new Thread(delegate()
        {
            int i = 0;
            while (++i < 100)
            {
                Console.WriteLine("Thread[" + Thread.CurrentThread.ManagedThreadId + "] is running: " + i);
                Thread.Sleep(10);
            }
        });
        newThread.Start();
        newThread.Join();
        Console.WriteLine("newThread finished.");
    }
}


 

上述测试代码中,在主线程(the calling thread)内调用newThread的Join()方法,导致主线程(the calling thread)被阻塞直至newThread结束,然后主线程继续执行。