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

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

    实现代码如下:

    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);
                        }
                    }
                }
    
            }
        }
    
    }


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

    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);可以不加,不过为了提高性能,就最好加上。加与不加的性能相差巨大的。请最好加上。

  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/3584714.html
Copyright © 2011-2022 走看看