多线程问题,怎么能让所有线程执行完后再执行之后的语句?急,在线等
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




