模仿并发线程(在相同的资源/方法上)

时间:2018-01-20 16:24:19

标签: c# multithreading

有没有什么方法可以模仿并发线程的一个简单的简单示例,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();
        }
}

1 个答案:

答案 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标记为静态变量。

希望它有所帮助。