C#Thread的Join方法

转载自:http://zhidao.baidu.com/link?url=NIjVTM9sxDOKXWYlQDHf-EziTWzANO_x1wNMEfzFzdjZ_fiG2U4mBSUGmyTzoNiSYjgSekBIKp-ZBVnFwIyMKVDp_ASqtMoSIJIoMQGehWy

MSDN的解释:阻塞调用线程,直到某个线程终止时为止。首先明确几个问题:

1、一个进程由一个或者多个线程组成,线程之间有可能会存在一定的先后关系和互斥关系。多线程编程,首先就是要想办法划分线程,减少线程之间的先后关系和互斥关系,这样才能保证线程之间的独立性,各自工作,不受影响。Google的MapReduce核心思想就是尽量减少线程之间的先后关系和互斥关系。

2、无论如何地想办法,线程之间还是会存在一定的先后关系和互斥关系,这时候可以使用Thread.Join方法。

3、一个线程在执行的过程中,可能调用另一个线程,前者可以称为调用线程,后者成为被调用线程。

4、Thread.Join方法的使用场景:调用线程挂起,等待被调用线程执行完毕后,继续执行。

5、被调用线程执行Join方法,告诉调用线程,你先暂停,我执行完了,你再执行。从而保证了先后关系。

6、考虑一种有意思的情况:在当前线程内调用Thread.CurrentThread.Join() 会出现什么情况?分析:假设当前线程为A,此时调用线程为A,被调用线程也为A,由于调用线程A暂停,被调用线程A(也就是调用线程A)永远不会执行完毕,造成死锁。

using System;
using System.Threading;

public class Example
{
   static Thread mainThread, thread1, thread2;

   public static void Main()
   {
      mainThread = Thread.CurrentThread;
      thread1 = new Thread(ThreadProc);
      thread1.Name = "Thread1";
      thread1.Start();

      thread2 = new Thread(ThreadProc);
      thread2.Name = "Thread2";
      thread2.Start();   
   }

   private static void ThreadProc()
   {
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      if (Thread.CurrentThread.Name == "Thread1" && 
          thread2.ThreadState != ThreadState.Unstarted)
         thread2.Join();

      Thread.Sleep(4000);
      Console.WriteLine("\nCurrent thread: {0}", Thread.CurrentThread.Name);
      Console.WriteLine("Thread1: {0}", thread1.ThreadState);
      Console.WriteLine("Thread2: {0}\n", thread2.ThreadState);
   }
}
// The example displays output like the following:
//       Current thread: Thread1
//       
//       Current thread: Thread2
//       
//       Current thread: Thread2
//       Thread1: WaitSleepJoin
//       Thread2: Running
//       
//       
//       Current thread: Thread1
//       Thread1: Running
//       Thread2: Stopped


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值