C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
2014-03-06 15:59
627 查看
添加三个线程同时启动执行某一方法,并依次调用某方法中的打印输: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);可以不加,不过为了提高性能,就最好加上。加与不加的性能相差巨大的。请最好加上。
相关文章推荐
- C#中添加三个线程同时启动执行某一方法,并依次调用某方法中的循环打印输。
- 面试题--三个线程循环打印ABC10次的几种解决方法
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 三个线程循环打印ABC10次的几种解决方法
- java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 迅雷笔试题 (JAVA多线程)启动三个线程,分别打印A B C,现在写一个程序 循环打印ABCABCABC
- 面试题--三个线程循环打印ABC 10次:另类解决方法
- 面试题--三个线程循环打印ABC10次的几种解决方法
- C#线程之异步调用(一)执行长时间的方法
- 两个线程A和B,任务都是打印当前时间,要求编码实现:线程A和B同时启动后,以先A后B的方式任务交叉执行10次。
- 三个线程循环打印ABC10次的几种解决方法
- Semaphore实现的三个线程协作循环打印10次ABC的方法
- 转:java实现三个线程A B C,A线程打印A之后才能B线程打印B,然后接着C线程执行打印C,继而循环下去
- 两个线程A和B,任务都是打印当前时间,要求编码实现:线程A和B同时启动后,以先A后B的方式任务交叉执行10次。
- C# 调用、执行 js 方法
- C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现(转载)
- C#线程调用带参数的方法 ~
- C#等待所有子线程执行完毕方法
- sql server 2008 System.Data.SqlClient.SqlException (0x80131904): 查询处理器未能为执行并行查询启动必要的线程资源 处理方法
- C#线程 在某一时间内,只有N个线程在并发执行,其余都在队列中的实现