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

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
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值