多线程为什么跑的比单线程还要慢的情况分析及验证

CSDN学院讲师招募,诚邀您加入!博客Markdown编辑器上线啦PMBOK第五版精讲视频教程火星人敏捷开发1001问

多线程为什么跑的比单线程还要慢的情况分析及验证

分类:java多线程编程

2014-05-04 07:56:50cnblogs.com-Ethan Cai-点击数:306

“多个人干活比一个人干活要快,多线程并行执行也比单线程要快”这是我学习编程长期以来的想法。然而在实际的开发过程中,并不是所有情况下都是这样。先看看下面的程序(点击下载):

ThreadTester是所有Tester的基类。所有的Tester都干的是同样一件事情,把counter增加到100000000,每次只能加1。

ThreadTester 2:{MAX_COUNTER_NUMBER = 100000000; 4: _counter = 0; 6: 7://获得计数GetCounter() 9:{._counter; 11:} 12: 13://增加计数器IncreaseCounter() 15:{ 16:this._counter += 1; 17:} 18: 19://启动测试Start(); 21: 22://获得Counter从开始增加到现在的数字所耗的时间GetElapsedMillisecondsOfIncreaseCounter(); 24: 25://测试是否正在运行IsTesterRunning(); 27:}

SingleThreadTester是单线程计数。

1:class SingleThreadTester : ThreadTester 2:{ 3:private Stopwatch _aStopWatch = new Stopwatch(); 4: Start() 6:{ 7:_aStopWatch.Start(); 8: 9:Thread aThread = new Thread(() => WorkInThread()); 10:aThread.Start(); 11:} 12: GetElapsedMillisecondsOfIncreaseCounter() 14:{._aStopWatch.ElapsedMilliseconds; 16:} 17: IsTesterRunning() 19:{ 20:return _aStopWatch.IsRunning; 21:} 22: WorkInThread() 24:{ 25:while (true) 26:{ 27:if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER) 28:{ 29:_aStopWatch.Stop(); 30:break; 31:} 32: 33:this.IncreaseCounter(); 34:} 35:} 36:}

TwoThreadSwitchTester是两个线程交替计数。

1:class TwoThreadSwitchTester : ThreadTester 2:{ 3:private Stopwatch _aStopWatch = new Stopwatch(); 4:private AutoResetEvent _autoResetEvent = new AutoResetEvent(false); 5: Start() 7:{ 8:_aStopWatch.Start(); 9: 10:Thread aThread1 = new Thread(() => Work1InThread()); 11:aThread1.Start(); 12: 13:Thread aThread2 = new Thread(() => Work2InThread()); 14:aThread2.Start(); 15:} 16: GetElapsedMillisecondsOfIncreaseCounter() 18:{._aStopWatch.ElapsedMilliseconds; 20:} 21: IsTesterRunning() 23:{ 24:return _aStopWatch.IsRunning; 25:} 26: Work1InThread() 28:{ 29:while (true) 30:{ 31:_autoResetEvent.WaitOne(); 32: 33:this.IncreaseCounter(); 34: 35:if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER) 36:{ 37:_aStopWatch.Stop(); 38:break; 39:} 40: 41:_autoResetEvent.Set(); 42:} 43:} 44: Work2InThread() 46:{ 47:while (true) 48:{ 49:_autoResetEvent.Set(); 50:_autoResetEvent.WaitOne(); 51:this.IncreaseCounter(); 52: 53:if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER) 54:{ 55:_aStopWatch.Stop(); 56:break; 57:} 58:} 59:} 60:}你怎么样对待别人被人就怎么样对待你。

多线程为什么跑的比单线程还要慢的情况分析及验证

相关文章:

你感兴趣的文章:

标签云: