2014-05-04 07:56:50cnblogs.com-Ethan Cai-点击数: 306
“多个人干活比一个人干活要快,多线程并行执行也比单线程要快”这是我学习编程长期以来的想法。然而在实际的开发过程中,并不是所有情况下都是这样。先看看下面的程序(点击下载):
ThreadTester是所有Tester的基类。所有的Tester都干的是同样一件事情,把counter增加到100000000,每次只能加1。
public abstract class ThreadTester {
public const long MAX_COUNTER_NUMBER = 100000000;
private long _counter = 0;
//获得计数
public long GetCounter() {
return this._counter;
}
//增加计数器
protected void IncreaseCounter() {
this._counter += 1;
}
//启动测试
public abstract void Start();
//获得Counter从开始增加到现在的数字所耗的时间
public abstract long GetElapsedMillisecondsOfIncreaseCounter();
//测试是否正在运行
public abstract bool IsTesterRunning();
}
SingleThreadTester是单线程计数。
class SingleThreadTester :ThreadTester
{
private Stopwatch _aStopWatch=new Stopwatch();
public override void Start()
{
_aStopWatch.Start();
Thread aThread=new Thread(()=>WorkInThread());
aThread.Start();
}
public override long GetElapsedMillisecondsOfIncreaseCounter()
{
return this._aStopWatch.ElapsedMilliseconds;
}
public override bool IsTesterRunning()
{
return _aStopWatch.IsRunning;
}
private void WorkInThread()
{
while(true)
{
if(this.GetCounter()>ThreadTester.MAX_COUNTER_NUMBER)
{
_aStopWatch.Stop();
break;
}
this.IncreaseCounter();
}
}
}
TwoThreadSwitchTester是两个线程交替计数。
class TwoThreadSwitchTester : ThreadTester
{
private Stopwatch _aStopWatch = new Stopwatch();
private AutoResetEvent _autoResetEvent = new AutoResetEvent(false);
public override void Start()
{
_aStopWatch.Start();
Thread aThread1 = new Thread(() => Work1InThread());
aThread1.Start();
Thread aThread2 = new Thread(() => Work2InThread());
aThread2.Start();
}
public override long GetElapsedMillisecondsOfIncreaseCounter()
{
return this._aStopWatch.ElapsedMilliseconds;
}
public override bool IsTesterRunning()
{
return _aStopWatch.IsRunning;
}
private void Work1InThread()
{
while (true)
{
_autoResetEvent.WaitOne();
this.IncreaseCounter();
if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
{
_aStopWatch.Stop();
break;
}
_autoResetEvent.Set();
}
}
private void Work2InThread()
{
while (true)
{
_autoResetEvent.Set();
_autoResetEvent.WaitOne();
this.IncreaseCounter();
if (this.GetCounter() > ThreadTester.MAX_COUNTER_NUMBER)
{
_aStopWatch.Stop();
break;
}
}
}
}
MultiThreadTester可以指定线程数,多个线程争抢计数。
class MultiThreadTester : ThreadTester
{
priva