程序线程问题!如何等到所有的线程结束然后才执行我的代码
using System;
using System.Threading;
using System.Data;
using System.Data.SqlClient;
namespace ThreadEx
{
class A
{
int start;
int end;
public A(int start,int end)
{
this.start=start;
this.end=end;
}
public A(string start,string end)
{
this.start=int.Parse(start);
this.end=int.Parse(end);
}
public void Fun()
{
for(int i=this.start;i <end;i++)
{
Console.WriteLine( "当前{0}线程执行了:{1} ",Thread.CurrentThread.Name,i.ToString());
}
}
}
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
private static bool IsCloseAllThread(Thread[] tr)
{
for(int i=0;i <tr.Length;i++)
{
if(tr[i].IsAlive)
{
return false;
}
}
return true;
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
public static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
System.Collections.Hashtable hs=new System.Collections.Hashtable();
Thread[] tr=new Thread[4];
A[] a=new A[tr.Length];
int count=50;//记录总数
int threads=tr.Length;//线程总数
int step=count/threads;//步长,每次循环之间的基数
int residue=count%threads;//数据中的余数
//计算每次循环之间的步长
for(int i=0;i <count;i+=step)
{
//如果有余数并且已经到了 临界点:例如 10/3 临界点是9
if(residue!=0 && i+step==count-residue)
{
hs[i.ToString()]=i+step+residue;
break;
}
else
{
hs[i.ToString()]=i+step;
}
}
int tempI=0;
foreach(string k in hs.Keys )
{
if(tempI <a.Length)
{
a[tempI]=new A(k.ToString(),hs[k].ToString());//初始化数组中的A对象
tr[tempI]=new Thread(new ThreadStart(a[tempI].Fun));//不同的线程对应不同的A对象
tr[tempI].Name= "TreadClass1_ "+tempI.ToString();//设置线程的名字
tr[tempI].Start();
tempI++;
}
}
// for(int i=0;i <a.Length;i++)
// {
// tr[i].Start();//启动线程
//// Console.WriteLine(k.ToString()+ ", "+hs[k].ToString());
// }
Console.WriteLine(Thread.CurrentThread.Name+ ":AAAAAAAAAAAAAAAAAAAAAAAAAAAA ");
}
}
}
我的程序执行的时候为什么会先打印AAAAAAAAAAAAAAAAAAAAAAAAAAAA,也就是
当我Console.WriteLine(Thread.CurrentThread.Name+ ":AAAAAAAAAAAAAAAAAAAAAAAAAAAA ");这段代码的时候 ,第一个线程已经开始执行了
我想等到所有的 线程都停掉然后在执行我的
Console.WriteLine(Thread.CurrentThread.Name+ ":AAAAAAAAAAAAAAAAAAAAAAAAAAAA ");这段
------解决方案--------------------写一个循环检查一下是不是tr中的所有线程的状态都是ThreadState.Stopped。如果有一个不是ThreadState.Stopped状态则继续等待,如果都已完成,则向下执行,比如:
while (true)
{
bool stop = true;
foreach (Thread t in tr)
{
if (t.ThreadState != ThreadState.Stopped)
{
stop = false