test(int i);执行时间不定1~100分钟。
开启三个线程。只同时运行三个函数,其余线程等待伪代码
for(int i=0;i<99999;i++){
test(i);
}
注意哦,你如果一下子开启99999线程(然后让其等待),会内存溢出。如果你开启的线程太慢可能函数test已经执行完毕我想要的结果是保证三个线程同时运行,使CPU的利用率达到最大值。

解决方案 »

  1.   

    Semaphore可以方便实现线程的运行数量,但是怎么控制线程开启速度呢?
    关键是线程执行时间不确定,使用for循环开启很容易内存溢出
      

  2.   

    比如,以下代码在amountThread = 11;//线程总量 为娇小值时没问题,大了就会报错。。
     private static int poolFlag = 0;//标记
            private const int amountThread = 999999;//线程总量
            private const int maxThread = 3;//可执行线程最大数量
            private static Mutex muxConsole = new Mutex();        public static void Mains()
            {
                for (int i = 0; i < amountThread; i++)
                {
                    // 创建指定数量的线程
                    // 是线程调用Run方法
                    // 启动线程
                    Thread trd = new Thread(new ThreadStart(Run));
                    trd.Name = "线程" + i;
                    trd.Start();
                }
            }        public static void Run()
            {            muxConsole.WaitOne();  //阻塞队列
                Interlocked.Increment(ref poolFlag);  //标记+1
                if (poolFlag != maxThread)             //判断是否等于上限
                    muxConsole.ReleaseMutex();     //如果此线程达不到可执行线程上限,则继续开通,让后面的线程进来
                Console.WriteLine("{0} 正在运行....../n", Thread.CurrentThread.Name);
                Thread.Sleep(5000);                                                                                             //模拟执行
                Console.WriteLine("{0} 已经中止....../n", Thread.CurrentThread.Name);            //标记-1
                Interlocked.Decrement(ref poolFlag);
            }
      

  3.   

    有一个标准的模式,把任务放在一个队列中,一般是LinkedList,然后创建三个线程,不断从队列中取出任务执行,直到队列空为止,这个模式有点复杂,但适应能力很强,
    LinkedList<int> lstTask=new LinkedList<int>;
    for(int i=0;i<99999;i++)
    {
       lstTask.AddLast(i);
    }...//创建3个线程
    for(i=0;i<3;i++)
    {
        CreateThread();
    }....public void CreateThread()
    {
       Thread h=new Thread(test);
    }public void test()
    {
        int nData;
        lock(lstTask)
        {
            if (lstTask.Count==0) return;
            nData=lstTask.First.Value;
            lstTask.RemoveFirst();
        }    ...//对nData处理
    }
      

  4.   

    如果是4.0的,可以用Task及其ContinueWith
      

  5.   

    http://blog.csdn.net/sq_zhuyi/article/details/6869661