最近刚刚学C#看了些书但是很多地方就是不明白 自己想做个多线程访问一个东西
也就是几个线程同时完成一件事情 我下面那个例子是6个线程 输出30
想要的结果是
0:0
2:1
3:2
4:3
5:4
1:5以此类推
总之就是不管是哪个线程输出都行 但是一定要是多个线程去执行这个输出任务
另外那个异常那个地方的捕获 次次都捕获到 好像是 线程正在终止 一下记不清了!!
麻烦大家 帮我改改代码 查查那个原因是怎么回事
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication6
{
class Program
{
Mutex m = new Mutex();
List<Thread> t = new List<Thread>();//保存线程
static void Main(string[] args)
{
Program p = new Program();
p.statr();
Console.ReadLine();
}
public Program()
{
for (int i = 0; i < 6; i++)//初始化建立2个线程
{
Thread therad = new Thread(run);
therad.Name = i.ToString();
t.Add(therad);
}
}
public void statr()
{
foreach (Thread tt in t)
{
tt.Start();//所有线程开始执行
}
}
public void run(object h)//这个h没啥用 关键是用来lock里面要个东西人家就告诉我这样写就可以了
{
try
{
lock (this)
{
for (int i = 0; i < 30; i++)
{
Console.WriteLine("{0}:{1}", Thread.CurrentThread.Name, i);
}
}
stop();//上面输出完毕 调用停止线程方法
}
catch (Exception ex)
{
Console.WriteLine(ex.Message.ToString());
}
}
public void stop()
{
Console.WriteLine("test ok");
foreach (Thread tt in t)
{
tt.Abort();//所有线程停止
}
}
}
}
c#多线程同步输出
答案:3 悬赏:20 手机版
解决时间 2021-04-30 16:30
- 提问者网友:孤凫
- 2021-04-30 04:07
最佳答案
- 五星知识达人网友:摆渡翁
- 2021-04-30 04:36
用一个Monitor锁定就OK了,下面是完整代码,你可以直接复制过去运行的class Program 正在运行", Thread.CurrentThread.Name, count); if (count == 50) count += 1; Monitor.Exit(this);//取消锁定 Thread.Sleep(5); } } public Program() ", i); ThreadCollection.Add(mythread); } OnNumberClear += new EventHandler(Program_OnNumberClear); } void Program_OnNumberClear(object sender, EventArgs e) } public void Action() } static void Main(string[] args) }
全部回答
- 1楼网友:上分大魔王
- 2021-04-30 07:08
加一个lock就可以了
private static object _syncOutObject= new object();
public static void Out(string message)
{
lock(_syncOutObject)
{
Console.WriteLine(message);
}
}
然后所有需要输出的地方就调用它就可以了,
这只是一个参考,具体这个方法有哪些参数,里面怎么实现,你自己可以去完成,
我这里只是演示lock的用法
- 2楼网友:旧脸谱
- 2021-04-30 05:44
你6个线程都虽然并行执行run(),但是lock(this)的时候里面的循环输出变成同步顺序执行了
所以输出会是1:0,1:1,1:2,...1:29,3:0,3:1,3:2,...3:29,2:0,2:1,...,这样的
如果你想打乱输出结果就不要在这里使用lock。
至于你说的"另外那个异常那个地方的捕获 次次都捕获到",是因为某个线程首先执行完输出就调用了stop(),stop的时候把所有线程都调用Abort()申请退出,但是其他有的线程还在执行stop(),结果就有“线程正在终止”之类的异常
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯