我现在在做一个有关数据计算的算法,由于数据比较大,我采用了多线程来进行跑数据,由于是按照日期进行跑的,我把日期集合每15天归为一组,对日期组进行集合遍历,每次执行50个线程,
//Lst_DateTimeList 每15天一组的日期集合 foreach (List<DateTime> item in Lst_DateTimeList) { //逻辑计算的参数 List<object> Lst_Obj = new List<object>() { mre, item }; //开启线程 IncrementSectionDate 方法是执行数据的计算以及数据的入库 Thread td = new Thread(new ParameterizedThreadStart(IncrementSectionDate)); td.Start(Lst_Obj); //开启的线程集合 Lst_Thread.Add(td); //线程50个数量的控制 while (Lst_Thread.Count >= 50) { Lst_Thread = Lst_Thread.Except(Lst_Thread.Where(r => r.IsAlive == false).ToList()).ToList(); Thread.Sleep(1000); } k++; }
我现在想在线程执行完后执行一些操作,我该怎么来判断多线程中的线程是否执行完成?
while (Lst_Thread.Where(r => r.IsAlive == false).Count() >= 50) { //执行一些方法 }
我现在采用 上面这种方式,不知道有上面更好的方式来进行控制呢?
请参考:http://www.cnblogs.com/heyuquan/archive/2012/12/16/2820775.html
判断多个线程是否都结束的几种方法
有园友问到此问题,所以提供下面几种方法。若还有其他方法请告知。
线程也可以采用计数器的方法,即为所有需要监视的线程设一个线程计数器,每开始一个线程,在线程的执行方法中为这个计数器加1,如果某个线程结束(在线程执行方法的最后),为这个计数器减1。使用这种方法需要使用原子操作(eg:Volatile、InterLocked)同步这个计数器变量。
join方法只有在线程结束时才继续执行下面的语句。可以对每一个线程调用它的join方法,但要注意,这个调用要在一个专门线程里做,而不要在主线程,否则程序会被阻塞。
IsAlive判断此线程是否还存活。经测试只有 Unstarted、Stopped 返回false;其他线程状态都返回true。
我们通过轮询检查此属性来判断线程是否结束。但要注意,这个调用要在一个专门线程里做,而不要在主线程,否则程序会被阻塞。
EG:while(true) { foreach(多个线程){ if(thread1.IsAlive) { } } }
Eg:WaitHandle。在后续章节中再说明
写个事件,每次线程执行完触发事件,当事件被触发的次数等于总共开启的线程数就是全部执行完了