MultiThreadTester可以指定线程数,多个线程争抢计数。
1: class MultiThreadTester : ThreadTester 2: { 3: private Stopwatch _aStopWatch = new Stopwatch(); 4: private readonly int _threadCount = 0; 5: private readonly object _counterLock = new object(); 6: 7: public MultiThreadTester(int threadCount) 8: { 9: this._threadCount = threadCount; 10: } 11: 12: public override void Start() 13: { 14: _aStopWatch.Start(); 15: 16: for (int i = 0; i < _threadCount; i++) 17: { 18: Thread aThread = new Thread(() => WorkInThread()); 19: aThread.Start(); 20: } 21: } 22: 23: public override long GetElapsedMillisecondsOfIncreaseCounter() 24: { 25: return this._aStopWatch.ElapsedMilliseconds; 26: } 27: 28: public override bool IsTesterRunning() 29: { 30: return _aStopWatch.IsRunning; 31: } 32: 33: private void WorkInThread() 34: { 35: while (true) 36: { 37: lock (_counterLock) 38: { 39: if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER) 40: { 41: _aStopWatch.Stop(); 42: break; 43: } 44: 45: this.IncreaseCounter(); 46: } 47: } 48: } 49: } |
Program的Main函数中,根据用户的选择来决定执行哪个测试类。
1: class Program 2: { 3: static void Main(string[] args) 4: { 5: 6: string inputText = GetUserChoice(); 7: 8: while (!"4".Equals(inputText)) 9: { 10: ThreadTester tester = GreateThreadTesterByInputText(inputText); 11: tester.Start(); 12: 13: while (true) 14: { 15: Console.WriteLine(GetStatusOfThreadTester(tester)); 16: if (!tester.IsTesterRunning()) 17: { 18: break; 19: } 20: Thread.Sleep(100); 21: } 22: 23: inputText = GetUserChoice(); 24: } 25: 26: Console.Write("Click enter to exit..."); 27: } 28: 29: private static string GetStatusOfThreadTester(ThreadTester tester) 30: { 31: return string.Format("[耗时{0}ms] counter = {1}, {2}", 32: tester.GetElapsedMillisecondsOfIncreaseCounter(), tester.GetCounter(), 33: tester.IsTesterRunning() ? "running" : "stopped"); 34: } 35: 36: private static ThreadTester GreateThreadTesterByInputText(string inputText) 37: { 38: switch (inputText) 39: { 40: case "1": 41: return new SingleThreadTester(); 42: case "2": 43: return new TwoThreadSwitchTester(); 44: default: 45: return new MultiThreadTester(100); 46: } 47: } 48: 49: private static string GetUserChoice() 50: { 51: Console.WriteLine(@"==Please select the option in the following list:== 52: 1. SingleThreadTester 53: 2. TwoThreadSwitchTester 54: 3. MultiThreadTester 55: 4. Exit"); 56: 57: string inputText = Console.ReadLine(); 58: 59: return inputText; 60: } 61: } |