要求功能是能完成生成10000个随机数,并用多线程实现显示10000数,显示10000数的和与将10000个数存入文件的3个功能如果使用单线程,依次执行main()中的pro.showNum();pro.getSum();pro.saveFile();可以实现以上功能,但是如果我使用了下面的线程方法,则执行效果不如预想。(在我用线程的方法中,如果我将10000改为100,则会出现显示出十个数之后显示出Console.Write("\n the sum is\t " + sum+"\t\n");这句的执行结果,之后并继续显示剩余的数,但是在处理10000个数的时候,只会显示10000个数,并未显示Console.Write("\n the sum is\t " + sum+"\t\n");这句的执行结果;而且文件中也只会显示几十个数字而已望高手指点,能帮我实现多线程的方法,并使其结果能和依次执行main()中的pro.showNum();pro.getSum();pro.saveFile();的效果相同谢谢)以下是我的代码,可能很幼稚,勿笑using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.IO;
namespace Vtune4
{
    class Program
    {
        public int[] arr;
        int num = 10000;
        int sum = 0;
        System.Text.StringBuilder strarr = new StringBuilder();
//===============生成10000个数的数组===========================
        public void generate()
        {
            Random rnd = new Random();
            arr = new int[10000];
            for (int i = 0; i < num; i++)
            {
                arr[i] = Convert.ToInt32((rnd.Next() % 1000) + 1);
            }            
        }
//========================显示10000个数===========================
        public void showNum()
        {
            Console.WriteLine("The random numbers are:");
            for (int i = 0; i < num; i++)
            {
                strarr.Append(arr[i].ToString()+"\t");
                Console.Write(arr[i] + "\t ");
            }
        }
//=======================求和并显示================================
        public void getSum()
        {
            for (int i = 0; i < num; i++)
            {
                sum += arr[i];
            }
            Console.Write("\n the sum is\t " + sum+"\t\n");
        }
//=======================文件保存==================================
        public void saveFile()
        {
            File.AppendAllText(@"saveFile.txt", strarr.ToString());
        }
        static void Main(string[] args)
        {
            Program pro = new Program();
            pro.generate();
//=======================这一段便是我头疼的地方===========================
            Thread thrshowNum = new Thread(new ThreadStart(pro.showNum));
            Thread thrgetSum = new Thread(new ThreadStart(pro.getSum));
            Thread thrsaveFile = new Thread(new ThreadStart(pro.saveFile));
            thrshowNum.Priority = ThreadPriority.Normal;
            thrgetSum.Priority = ThreadPriority.Highest;
            thrsaveFile.Priority = ThreadPriority.Lowest;
            thrgetSum.Start();
            thrshowNum.Start();
            thrsaveFile.Start();
//=========================================================================
            //pro.showNum();
            //pro.getSum();
            //pro.saveFile();
        }
    }
}

解决方案 »

  1.   

                thrgetSum.Start(); //这里是一个程序执行分支
                thrshowNum.Start(); //这里是一个程序执行分支
                thrsaveFile.Start(); //这里还是一个程序执行分支,您知道线程是什么吗?
    上面三个根据不会顺序执行,而是乱序执行对应的方法,
    这下你明白了吗?
      

  2.   

    看一下Thread.Join();是什么意思吧,
      

  3.   

    不知理解的对不对:Start()是启动一个线程,Join()是对这一线程实现控制,这一线程在运行时,其他的线程则等待;直至这一线程执行结束在调用另一个线程。
    我对代码执行了如下修改,执行的效果满足要求,不过我就觉得如果这样则和不使用多线程执行似乎没有区别。还请指点
                thrshowNum.Start();
                thrshowNum.Join();
                thrgetSum.Start();
                thrgetSum.Join(); 
                thrsaveFile.Start();
                thrsaveFile.Join();
      

  4.   

    感觉显示这么多数据不应该用Console。那会造成很大的延迟。strarr.Append(arr[i].ToString()+"\t");
    这一句应该放到generate()方法里,不然写进文件的时候只能显示你说的那几行。  
      

  5.   

    至于Console.Write("\n the sum is\t " +sum+"\t\n");这句理论上是能显示的。但既然不行,肯定是哪里有问题,你可以这样去测试下:
            public void getSum()
            {
                //加上以一句这个
                Console.Write("-------Test----------");
                for (int i = 0; i < num; i++)
                {
                    sum += arr[i];
                }
                Console.Write("\n the sum is\t " + sum+"\t\n");
            } 
    看看最后又没显示出-------Test----------