有没有什么方法可以模仿并发线程的一个简单的简单示例,2个线程可以同时启动相同的方法,并且处理在两者之间混合?
在下面的例子中,我希望看到像:
1 thread1
1 thread2
2 thread1
2 thread2
..
10 thread1
10 thread2
相反,我得到了类似的东西:
1 thread1
2 thread1
...
10 thread1
1 thread2
2 thread2
...
10 thread2
善待,我刚刚开始学习线程。
简而言之,我想模拟两个线程在完全相同的时间开始的效果,而不是紧接着另一个线程的效果。
在我实现上面提到的之后,我想使用lock来让thread1在启动thread2之前完全执行。即使在使用锁之前,这已经在我的例子中发生了。
using System;
using System.Threading;
public class Program
{
public class C1
{
private object obj = new object();
public void Ten()
{
//lock(obj)
//{
for(int i=1; i<=10; i++)
{
Console.WriteLine(i + " " + Thread.CurrentThread.Name);
}
//}
}
}
public static void Main()
{
Thread t1 = new Thread(new ThreadStart(new C1().Ten));
Thread t2 = new Thread(new ThreadStart(new C1().Ten));
t1.Name = "thread1";
t2.Name = "thread2";
t1.Start();
t2.Start();
}
}
答案 0 :(得分:1)
作为评论中提到的ESG
,代码运行得太快了。这就是为什么你没有得到预期的输出。尝试在循环中添加一些睡眠以获得预期的结果。
using System;
using System.Threading;
public class Program
{
public class C1
{
private static object obj = new object();
public void Ten()
{
//lock(obj)
//{
for(int i=1; i<=10; i++)
{
Console.WriteLine(i + " " + Thread.CurrentThread.Name);
Thread.Sleep(1000); //<-- add sleep
}
//}
}
}
public static void Main()
{
Thread t1 = new Thread(new ThreadStart(new C1().Ten));
Thread t2 = new Thread(new ThreadStart(new C1().Ten));
t1.Name = "thread1";
t2.Name = "thread2";
t1.Start();
t2.Start();
}
}
关于锁定资源的第二个注释,以便thread2应该等待thread1完成。您需要将obj
标记为静态变量。
希望它有所帮助。