首页 > 其他 > 详细

C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。

时间:2014-03-07 16:48:05      阅读:525      评论:0      收藏:0      [点我收藏+]

添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输:ABC ABC ABC ABC

 

bubuko.com,布布扣

 

 

 

实现代码如下:

bubuko.com,布布扣
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SuperMarket.Test
{
    class Program
    {
        static void Main(string[] args)
        {
            myTests mt = new myTests();
            mt.RunTest();

        }

    }
    class myTests
    {
        char last = c;
        object obj = new object();
        public void RunTest()
        {
            Thread th1 = new Thread(ShowNum);
            Thread th2 = new Thread(ShowNum);
            Thread th3 = new Thread(ShowNum);

            th1.Start(a);
            th2.Start(b);
            th3.Start(c);



        }

        private void ShowNum(object name)
        {
            for (int i = 0; i < 300; i++)
            {
                lock (obj)
                {
                    if ((Char)name == last + 1 || (Char)name == last - 2)//如果是连续的下一个字
                    {
                        Console.WriteLine(name);
                        last = (Char)name;
                        Monitor.PulseAll(obj);
                    }
                    else
                    {
                        i--;
                        Monitor.Wait(obj);
                    }
                }
            }

        }
    }

}
bubuko.com,布布扣


这里介绍下上面的几处用法:

bubuko.com,布布扣

1、三个线程同时调用ShowNum方法,这时候,由于进入ShowNum方法的先后不同。所以,在执行300次循环时,调用的内容先后是不同的。因此,我们要定义一个Object对像,然后使用lock(obj)将进入循环体的线程锁定。

2、使用last变量来存放本次打印在屏幕上的字母。下一次进入判断体时,就知道下一个要打印的是什么了。默认值为c,就意味着第一个要打印的是c-2=a,所以是a字母。

3、对于本轮不应该打印的线程,就让他到lock外面等候通知。所以调用了Moitor.Wait(obj)方法。因为本次他也执行了判断,所以循环就少了一次,为了给被回循环,就让循环变量i的值-1,这就是i--的原因。

4、当打印完后,记录好本次打印了的字母后,要调用 Monitor.PulseAll方法通知那个正在等候的线程,进入Lock体做判断。

5、  Monitor.Wait(obj);和 Monitor.PulseAll(obj);可以不加,不过为了提高性能,就最好加上。加与不加的性能相差巨大的。请最好加上。

C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。,布布扣,bubuko.com

C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。

原文:http://www.cnblogs.com/songxingzhu/p/3584714.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!