多线程,输出错误

时间:2016-07-04 19:52:24

标签: c# c#-4.0

我正在尝试制作多线程应用程序。但输入只有一个线程。但我尝试用三个线程来制作它。这是该计划:

class MyThread
    {
        public int Count;
        public Thread Thrd;
        public MyThread(string name)
        {
            Count = 0;
            Thrd = new Thread(this.Run);
            Thrd.Name = name;
            Thrd.Start();
        }
        // Entry point of thread.
        void Run()
        {
            Console.WriteLine(Thrd.Name + " starting.");
            do
            {
                Thread.Sleep(500);
                Console.WriteLine("In " + Thrd.Name +
                ", Count is " + Count);
                Count++;
            } while (Count < 10);
            Console.WriteLine(Thrd.Name + " terminating.");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("Main thread starting.");
            // Construct three threads.
            MyThread mt1 = new MyThread("Child #1");
            MyThread mt2 = new MyThread("Child #2");
            MyThread mt3 = new MyThread("Child #3");
            while (true)
            {
                Console.Write(".");
                Thread.Sleep(100);
                if (mt1.Count < 10 && mt2.Count < 10 &&  mt3.Count < 10)
                {
                    break; 
                }
                Console.WriteLine("Main thread ending.");
            }
            //do
            //{
            //    Console.Write(".");
            //    Thread.Sleep(100);
            //} 
            //while (mt1.Count < 10 && mt2.Count < 10 &&  mt3.Count < 10);
            //Console.WriteLine("Main thread ending.");
           // Console.ReadKey();
        }
    }

但输出是:见图片: enter image description here

所以它只显示一个线程。而不是三个线程。

感谢你

这必须是输出:

Main thread starting.
.Child #1 starting.
Child #2 starting.
Child #3 starting.
....In Child #1, Count is 0
In Child #2, Count is 0
In Child #3, Count is 0
.....In Child #1, Count is 1
In Child #2, Count is 1
In Child #3, Count is 1
.....In Child #1, Count is 2
In Child #2, Count is 2
In Child #3, Count is 2
.....In Child #1, Count is 3
In Child #2, Count is 3
In Child #3, Count is 3
.....In Child #1, Count is 4
In Child #2, Count is 4
In Child #3, Count is 4
.....In Child #1, Count is 5
In Child #2, Count is 5
In Child #3, Count is 5
.....In Child #1, Count is 6
In Child #2, Count is 6
In Child #3, Count is 6
.....In Child #1, Count is 7
In Child #2, Count is 7
In Child #3, Count is 7
.....In Child #1, Count is 8
In Child #2, Count is 8
In Child #3, Count is 8
.....In Child #1, Count is 9
Child #1 terminating.
In Child #2, Count is 9
Child #2 terminating.
In Child #3, Count is 9
Child #3 terminating.
Main thread ending.

但如果我这样做:

static void Main(string[] args)
        {

            Console.WriteLine("Main thread starting.");
            // Construct three threads.
            MyThread mt1 = new MyThread("Child #1");
            MyThread mt2 = new MyThread("Child #2");
            MyThread mt3 = new MyThread("Child #3");
            //while (true)
            //{
            //    Console.Write(".");
            //    Thread.Sleep(100);
            //    if (mt1.Count < 10 && mt2.Count < 10 &&  mt3.Count < 10)
            //    {
            //        break; 
            //    }
            //    Console.WriteLine("Main thread ending.");
            //}
            do
            {
                Console.Write(".");
                Thread.Sleep(100);
            }
            while (mt1.Count < 10 && mt2.Count < 10 && mt3.Count < 10);
            Console.WriteLine("Main thread ending.");
            Console.ReadKey();
        }

它给出了相同的结果。

如果我这样做:

Console.WriteLine("Main thread starting.");
            // Construct three threads.
            MyThread mt1 = new MyThread("Child #1");
            MyThread mt2 = new MyThread("Child #2");
            MyThread mt3 = new MyThread("Child #3");

            mt1.Thrd.Join();
            mt2.Thrd.Join();
            mt3.Thrd.Join();

            do
            {
                Console.Write(".");
                Thread.Sleep(100);
            } while (mt1.Thrd.IsAlive &&  mt2.Thrd.IsAlive &&  mt3.Thrd.IsAlive);
            Console.WriteLine("Main thread ending.");

结果相同。只有一个帖子。

我这样试试:

  static void Main(string[] args)
        {
            Console.WriteLine("Main thread starting.");
            // Construct three threads.
            MyThread mt1 = new MyThread("Child #1");
            MyThread mt2 = new MyThread("Child #2");
            MyThread mt3 = new MyThread("Child #3");

            mt1.Thrd.Join();
            mt2.Thrd.Join();
            mt3.Thrd.Join();

            do
            {
                Console.Write(".");
                Thread.Sleep(100);
            } while (mt1.Count < 10 || mt2.Count < 10 || mt3.Count < 10);
            Console.WriteLine("Main thread ending.");

但结果仍然相同。

哦:

这对我有用!!

Console.WriteLine("Main thread starting.");
            // Construct three threads.
            MyThread mt1 = new MyThread("Child #1");
            MyThread mt2 = new MyThread("Child #2");
            MyThread mt3 = new MyThread("Child #3");

            mt1.Thrd.Join();
            mt2.Thrd.Join();
            mt3.Thrd.Join();

            do
            {
                Console.Write(".");
                Thread.Sleep(100);
            } while (mt1.Thrd.IsAlive || mt2.Thrd.IsAlive || mt3.Thrd.IsAlive);
            Console.WriteLine("Main thread ending.");

3 个答案:

答案 0 :(得分:2)

您正在创建三个课程。每个类都创建一个新线程,该线程递增其自己的属性。但是,如果所有数字小于10,那么您将退出控制台应用程序。换句话说,如果其中任何一个在其他数字之前达到10

while (mt1.Count < 10 && mt2.Count < 10 && mt3.Count < 10);

然后Main()将结束。在检查该条件之前,不能保证这些计数中的任何一个都达到10,更不用说所有这三个。其中一个甚至可以在其他人开始之前达到10个。

如果你改变它,你会更接近预期的影响:

while (mt1.Count < 10 || mt2.Count < 10 || mt3.Count < 10);

换句话说,如果中的任何一个小于10,那就继续吧。当他们都达到10时,停止。

您发现(或已经拥有)的其他内容是,除非您小心,否则多线程应用程序可能会以不可预测,不一致的方式运行。没有什么比一个99%的时间完美运行的程序更令人沮丧,但突然做了不同的事情,然后它再次按预期工作。 OptaPlanner您可以在其中测试并查看输出。

答案 1 :(得分:0)

你所拥有的if语句是不正确的,根本不起作用。当我使用&#34; while&#34;版本,你的代码对我有用,除了你检测线程何时完成的策略是错误的(甚至可能是你的问题的来源)。试试这段代码,看看你的问题是否消失了。如果没有,那么您可能会遇到可用内存/ CPU /线程池本地问题。重新启动计算机,然后重试:)

static void Main(string[] args)
{
    Console.WriteLine("Main thread starting.");

    MyThread mt1 = new MyThread("Child #1");
    MyThread mt2 = new MyThread("Child #2");
    MyThread mt3 = new MyThread("Child #3");

    mt1.Thrd.Join();
    mt2.Thrd.Join();
    mt3.Thrd.Join();

    Console.WriteLine("Main thread ending.");
}

答案 2 :(得分:0)

我找到了解决方案。看我的帖子