为什么要使用多线程

一:多线程的一些解释(来至知乎),我觉得解释的比较好,比较详细,就给大家分享一下

1、单进程单线程:一个人在一张桌子上吃菜

2、单进程多线程:多个人在同一张桌子上吃菜

3、多进程单线程:多个人每个人在自己的桌子上吃菜

多线程的问题就是多个人在同一张桌子上吃同一道菜时会发生争抢,如果两个人同时夹一道菜,一个人刚伸出筷子,结果菜已经被另一个人夹走了,这样,就会等一个人夹一口后,在换另一个人来夹菜,也就是说资源共享会发生冲突争抢。


对于 Windows 系统来说,【开桌子】的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜。因此 Windows 多线程学习重点是要大量面对资源争抢与同步方面的问题。


2对于 Linux 系统来说,【开桌子】的开销很小,因此 Linux 鼓励大家尽量每个人都开自己的桌子吃菜。这带来新的问题是:坐在两张不同的桌子上,说话不方便。因此,Linux 下的学习重点大家要学习进程间通讯的方法。


作者:pansz
链接:https://www.zhihu.com/question/19901763/answer/13299543
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、下面我们来一个实例对比一下使用多线程和使用传统方法
1、背景

京东商城官网发布公告称,“‘618’活动异常火爆且用户下单速度空前,致使部分用户已购订单显示出现延迟,用户在一段时间内无法在‘我的京东’中查询到自己的订单。目前已购订单显示延迟的问题已得到有效解决,对此给您带来的不便,我们深表歉意。”

2、实例

我们来模拟处理订单。假设程序后台有个monitor实时监控订单,如果发现订单就提交,然后处理订单,需要向仓库系统发出指令,负责配送发货。下面我们来模拟这个场景

定义一个订单帮助类

 public class JobHelper
    {
        /// <summary>
        /// 获取订单数量,假设100个
        /// </summary>
        /// <returns></returns>
        public int GetJobCount()
        {
            return 100;
        }

        /// <summary>
        /// 提交订单,假设每秒处理一个订单
        /// </summary>
        /// <param name="jobID"></param>
        /// <returns></returns>
        public bool SubmitJob(int jobID)
        {
            Thread.Sleep(1000);
            return true;
        }
    }

  Program类:

class Program
    {
        private static JobHelper jobhelper = new JobHelper();
        private static Mutex mutex;
        static void Main(string[] args)
        {
            #region 传统方法
            //DateTime startTime = DateTime.Now.ToLocalTime();
            //int OrderCount = jobhelper.GetJobCount();
            //mutex = new Mutex(false, "ThreadDemo");
            //if (!mutex.WaitOne(0, false))
            //{
            //    Console.WriteLine("Monitor already running...");
            //    return;
            //}
            //for (int i = 1; i <= OrderCount; i++)
            //{
            //    jobhelper.SubmitJob(i);
            //}

            //DateTime complete = DateTime.Now.ToLocalTime();
            //var minutes = (complete - startTime).TotalSeconds;
            //Console.WriteLine(string.Format("处理{0}个订单,花费时间{1}秒", OrderCount, minutes));
            //Console.ReadKey();
            #endregion

            #region 多线程Task方法
            DateTime startTime = DateTime.Now.ToLocalTime();
            int OrderCount = jobhelper.GetJobCount();
            // 用一个指示调用线程是否应拥有互斥体的初始所属权的布尔值来初始化 Mutex 类的新实例。
            // 当前进程只能启动一次
            mutex = new Mutex(false, "ThreadDemo");
            if (!mutex.WaitOne(0, false))
            {
                Console.WriteLine("Monitor already running...");
                return;
            }
            var tasklist = new List<Task>();
            for (int i = 1; i <= OrderCount; i++)
            {
                int temp = i;
                tasklist.Add(Task.Factory.StartNew(()=>
                {
                    jobhelper.SubmitJob(temp);
                }));
            }
            Task.WaitAll(tasklist.ToArray());
            DateTime completeTime = DateTime.Now.ToLocalTime();
            var minutes = (completeTime - startTime).TotalSeconds;
            Console.WriteLine(string.Format("处理{0}个订单,花费时间{1}秒", OrderCount, minutes));
            Console.ReadKey();
            #endregion

        }
    }

结果:

传统方法:


多线程Task方法:

所以多线程的意思就是多个线程一起去协同完成一个任务,通过充分去共享资源来达到提升效率的一种编程思想

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值