实验报告
实验目的
构建线程A1、A2… Ak (k>=3 )和线程B的程序(K生产者和单消费者)。A1、A2… AK从磁盘各自读取一个文本文件,写入到内存中的固定的容器(如Pool)。A1、 A2… Ak读取每一行时,都会休眠,然后在随机的时间(10-100ms)醒来继续尝试执行。程序要求按照A1、A2… Ak的顺序写入Pool。B会观察Pool的状态,如果有新数据,则进行读取,否则B处于等待状态。注意, A1、A2… Ak不能互相干扰。当所有的文件被读取完毕,且B读取完毕时,程序结束。
实验环境
VS2019、C#
功能介绍
多线程读取文件,将txt文件a1~a6中的内容读取到a7.txt之中
功能实现过程
生产者
private void put(object i)//从磁盘各自读取一个文本文件
{
Random random = new Random();
Monitor.Enter(this);//获取this的排它锁
while (mark || num != (int)i)
{
Monitor.Pulse(this);//丢锁之前都要pulse提醒等待队列里的线程去捡锁,否则等待线程是会一直等待的。
Monitor.Wait(this);
}
//false
mark = !mark;//当释放时,把锁给get
string mystr = "";
FileStream fs = File.OpenRead("a" + Convert.ToString(i) + ".txt");
StreamReader sr = new StreamReader(fs, Encoding.Default);
while (sr.Peek() > -1)
{
mystr += sr.ReadLine() + "\n";
// Thread.Sleep(random.Next(10, 100));
}
pool.Add(mystr);//把文件添加到容器
mytext2 += mystr;
sr.Close();
fs.Close();
num++;
Monitor.Pulse(this);
Monitor.Exit(this);
}
消费者
private void get()
{
for (int i = 0; i < 6; i++)
{
Monitor.Enter(this);
while (!mark)
{
Monitor.Pulse(this);
Monitor.Wait(this);
}
mark = !mark;
mytext += pool[pool.Count - 1];
Monitor.Pulse(this);
Monitor.Exit(this);
}
}
button控件
private void button1_Click(object sender, EventArgs e)
{
Thread workth1 = new Thread(put);
Thread workth2 = new Thread(put);
Thread workth3 = new Thread(put);
Thread workth4 = new Thread(put);
Thread workth5 = new Thread(put);
Thread workth6 = new Thread(put);
Thread workth7 = new Thread(get);
workth1.Start(1);
workth2.Start(2);
workth3.Start(3);
workth4.Start(4);
workth5.Start(5);
workth6.Start(6);
workth7.Start();
Thread.Sleep(2000);
workth1.Abort();
workth2.Abort();
workth3.Abort();
workth4.Abort();
workth5.Abort();
workth6.Abort();
workth7.Abort();
richTextBox1.Text = mytext;
richTextBox2.Text = mytext2;
}
实验效果展示
1.执行之前
2.执行后