CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

多线程问题,怎么能让所有线程执行完后再执行之后的语句?急,在线等

楼主Mirricle(Miracle Supply)2006-04-29 11:26:29 在 .NET技术 / C# 提问

public   void()  
  {  
  Thread[]   threads   =   new   Thread[4];  
   
  for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  Thread   t   =   new   Thread(new   ThreadStart(Add));  
  threads[i]   =   t;  
  }  
  for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  threads[i].Start();  
  }  
   
  SomeMethod();  
  }  
  public   void   Add()  
  {  
  //  
  }  
   
  Add是个需要执行时间比较长的函数  
   
  我想等生成的这四个线程全执行完Add再去执行SomeMethod  
   
  可这写的话threads[i].Start();之后,就利马执行SomeMethod了  
   
  怎么解决?让生成的所有线程全执行完,再执行接下来的语句  
  问题点数:100、回复次数:29Top

1 楼viena(维也纳N02)回复于 2006-04-29 11:31:12 得分 10

Thread.Join   方法  
  阻塞调用线程,直到某个线程终止时为止  
  Top

2 楼Mirricle(Miracle Supply)回复于 2006-04-29 11:31:13 得分 0

或者说   怎么判断一个线程是否执行完毕Top

3 楼Mirricle(Miracle Supply)回复于 2006-04-29 11:31:47 得分 0

for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  threads[i].Start();  
  }  
  for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  threads[i].Join();  
  }  
   
  ??Top

4 楼copico(北北)回复于 2006-04-29 11:34:44 得分 0

public   void()  
  {    
    lock(this)  
  {  
  Thread[]   threads   =   new   Thread[4];  
   
  for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  Thread   t   =   new   Thread(new   ThreadStart(Add));  
  threads[i]   =   t;  
  }  
  for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  threads[i].Start();  
  }  
  }  
   
  SomeMethod();  
  }  
  public   void   Add()  
  {  
  //  
  }Top

5 楼xinyangt(信仰t)回复于 2006-04-29 11:39:07 得分 0

把你的通过Name属性找到要暂停的程先  
   
   
  Thread.CurrentThread.Suspend();//挂起  
  Thread.CurrentThread.Resume.//唤醒Top

6 楼xinyangt(信仰t)回复于 2006-04-29 11:39:33 得分 0

Resume()Top

7 楼cowlilian()回复于 2006-04-29 11:39:35 得分 0

赞成上面的lock方法Top

8 楼Mirricle(Miracle Supply)回复于 2006-04-29 11:39:50 得分 0

就手问一下LOCK的问题    
  ASP.NET中  
  两个人访问就是两个HTTP请求,就会生成两个当前ASPX页面的类的对象对吧  
  这个类里有个地方是被lock住了  
  一个对象进入这个段代码,另外一个HTTP请求还能进入么?  
   
  我的理解是LOCK是对同一个对象中的多线程起作用的  
  两个对象,LOCK就不管用了,对么?也就是说另外一个HTTP请求是可以进入的,对么?Top

9 楼Mirricle(Miracle Supply)回复于 2006-04-29 11:41:34 得分 0

for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  threads[i].Start();  
  }  
  for   (int   i   =   0;   i   <   threadCount;   i++)  
  {  
  threads[i].Join();  
  }  
   
  ??  
   
   
  我用这种方法测试成功了  
   
  LOCK的没试  
   
  有人说赞成LOCK     那能告诉我为什么JOIN的方式不好么?Top

10 楼MyLf(不睡觉的鱼)回复于 2006-04-29 11:42:39 得分 0

那你用多线程干嘛?Top

11 楼Mirricle(Miracle Supply)回复于 2006-04-29 11:45:59 得分 0

那四个是多线程啊  
   
  在外面还有个循环,我想每循环一次是多线程而已  
   
  如果不等这四个线程执行完毕,外面的那个循环马上就又建四个线程  
  Top

12 楼Mirricle(Miracle Supply)回复于 2006-04-29 11:51:38 得分 0

测试了,LOCK的不成功  
   
  发现了JOIN也有一个问题,JOIN也是四个线程分别JOIN  
   
  也就是说,只能判断某个线程是否执行完毕,如果这个线程执行完毕了,他马上就会再建立一个新的线程了  
   
  我是想等四个线程全执行完毕,然后执行下面的语句,怎么办?  
  Top

13 楼Mirricle(Miracle Supply)回复于 2006-04-29 12:11:05 得分 0

UPTop

14 楼Knight94(愚翁)回复于 2006-04-29 13:05:59 得分 30

这是你线程之间规划的问题,比较好地解决办法应该是如下:  
  1、创建每个子线程的时候,要提供回调函数,并给他们分配一个唯一ID号;  
  2、每个子线程完成后,用自己的唯一ID号来调用回调函数;  
  3、在回调函数中,判断当前的ID号是否收齐,如果收齐,触发相应的事件。Top

15 楼sugarsupper(智慧之刃)回复于 2006-04-29 13:11:41 得分 0

while(true)  
  {  
        //不断监测所有子线程状态  
      if(finished.count==total.count)  
        break;  
  }  
  用一个类实现thread。start(),在最后通知住程序完成自身任务  
  {  
        parent.addtofinishedqueue(value);  
  }Top

16 楼Mirricle(Miracle Supply)回复于 2006-04-29 13:18:05 得分 0

Knight94(愚翁)能说具体点么   谢了  
   
  关于我回贴中提到的LOCK问题   能回答下么Top

17 楼zhongkeruanjian(编程亮子)回复于 2006-04-29 13:57:33 得分 60

使用线程池:  
    class   Program  
          {  
                  static   void   Main(string[]   args)  
                  {  
                          ManualResetEvent[]   manualEvents   =   new   ManualResetEvent[4];  
                          for   (int   i   =   0;   i   <   4;   i++)  
                          {  
                                  manualEvents[i]   =   new   ManualResetEvent(false);  
                                  System.Threading.ThreadPool.QueueUserWorkItem(new   WaitCallback(Add),   manualEvents[i]);  
                          }  
                          WaitHandle.WaitAll(manualEvents);  
                          Console.Write("All   Thread   Over");  
                          Console.ReadLine();    
                  }  
                  public   static   void   Add(object   stateinfo)  
                  {  
                          try  
                          {  
                                  Console.WriteLine("I   am   over");  
                          }  
                          catch  
                          {  
                          }  
                          finally  
                          {  
                                  ManualResetEvent   manualEvent   =   (ManualResetEvent)stateinfo;  
                                  manualEvent.Set();  
   
                          }  
                  }  
          }  
  结果:  
  I   am   over  
  I   am   over  
  I   am   over  
  I   am   over  
  All   Thread   Over  
  Top

18 楼Knight94(愚翁)回复于 2006-04-29 14:03:57 得分 0

Lock好像是线程之间的互斥吧,与你要完成的,没什么不是一回事Top

19 楼Knight94(愚翁)回复于 2006-04-29 14:04:31 得分 0

Lock好像是线程之间的互斥吧,与你要完成的不是一回事Top

20 楼Knight94(愚翁)回复于 2006-04-29 14:05:07 得分 0

你要完成的是线程之间的同步问题Top

21 楼Mirricle(Miracle Supply)回复于 2006-04-29 14:12:35 得分 0

我知道   LOCK是另外一个问题  
  线程同步的问题用zhongkeruanjian(编程亮子)   (   )   信誉:75   的线程池方法解决了  
   
  LOCK谁能解释一下  
  =======  
  就手问一下LOCK的问题    
  ASP.NET中  
  两个人访问就是两个HTTP请求,就会生成两个当前ASPX页面的类的对象对吧  
  这个类里有个地方是被lock住了  
  一个对象进入这个段代码,另外一个HTTP请求还能进入么?  
   
  我的理解是LOCK是对同一个对象中的多线程起作用的  
  两个对象,LOCK就不管用了,对么?也就是说另外一个HTTP请求是可以进入的,对么?  
   
   
  完事了就揭帖   谢谢大家Top

22 楼Mirricle(Miracle Supply)回复于 2006-04-29 14:15:11 得分 0

再确认一下  
   
  线程池那样  
   
  是四个线程同时执行吧?不会是一个挨着一个执行吧?Top

23 楼Mirricle(Miracle Supply)回复于 2006-04-29 14:15:53 得分 0

我是想四个线程同时执行     然后“一起结束”     进入下一条语句Top

24 楼jhtchina(学习构架设计)回复于 2006-04-29 14:17:36 得分 0

lock  
  Top

25 楼zhongkeruanjian(编程亮子)回复于 2006-04-29 14:19:48 得分 0

那肯定是同时执行了。  
   
  LOCK是对象锁,只有多个线程在访问同一个对象实例的时候用LOCK才有效。  
   
  两个HTTP会生成两个ASPX对象。LOCK没有作用的。  
   
  你的理解是对的Top

26 楼Mirricle(Miracle Supply)回复于 2006-04-29 14:20:48 得分 0

好啦     揭帖     谢谢Top

27 楼Knight94(愚翁)回复于 2006-04-29 14:29:12 得分 0

建议使用mutex效果更好一些。Top

28 楼aaazxd(量天)回复于 2006-05-09 19:32:41 得分 0

markTop

29 楼LoveMango(幻风)回复于 2006-10-13 17:32:58 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:Mirricle
  • viena
  • Knight94
  • zhongkeruanjian

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo