模拟并发线程(在同一资源/方法上)


有什么

方法可以模仿一个简短的并发线程说明性示例,即 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标记为静态变量。

希望对您有所帮助。

最新更新