有什么
方法可以模仿一个简短的并发线程说明性示例,即 2 个线程可以同时启动相同的方法,并且处理在两者之间混合?
在下面的示例中,我想看到如下所示的 sth:
1 thread1
1 thread2
2 thread1
2 thread2
..
10 thread1
10 thread2
相反,我得到类似的东西:
1 thread1
2 thread1
...
10 thread1
1 thread2
2 thread2
...
10 thread2
善良,我刚刚开始学习线程。
简而言之,我想模拟两个线程同时开始的效果,而不是一个接一个。
在我实现上述目标后,我想使用锁,以便线程 1 在启动 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();
}
}
正如注释中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();
}
}
关于锁定资源的第二个注意事项,以便线程 2 应等待线程 1 完成。您需要将obj
标记为静态变量。
希望对您有所帮助。