要求功能是能完成生成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();
}
}
}
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();
}
}
}
解决方案 »
- Enterprise Library数据连接缓冲池超限的问题
- 防止程序多次启动问题
- 请问在C#里怎么把BMP图片存到access的OLE对象字段中?谢谢
- 大家帮忙看看这代码为什么错了?
- 使用Remoting的过程中,出现了这样一个现象
- 如何实现Combox下拉列表中选中多个值,以 ‘ ,’分割
- 请教多线程并行调用dll的问题
- vs2010 + svn 请问如何做codereview
- 请问 oleDbConnection1.ConnectionString = @"Provider=SQLOLEDB.1;..."中的@的符号是什么意思?
- 如何用C#读写DI/DO?
- 如何用一个byte来表示0~100之间的1位小数?
- 关于会员管理软件和刷卡设备的接口
thrshowNum.Start(); //这里是一个程序执行分支
thrsaveFile.Start(); //这里还是一个程序执行分支,您知道线程是什么吗?
上面三个根据不会顺序执行,而是乱序执行对应的方法,
这下你明白了吗?
我对代码执行了如下修改,执行的效果满足要求,不过我就觉得如果这样则和不使用多线程执行似乎没有区别。还请指点
thrshowNum.Start();
thrshowNum.Join();
thrgetSum.Start();
thrgetSum.Join();
thrsaveFile.Start();
thrsaveFile.Join();
这一句应该放到generate()方法里,不然写进文件的时候只能显示你说的那几行。
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----------