【ITOO】--不知道多线程你就就out了

来源:互联网 发布:连接u8数据服务器失败 编辑:程序博客网 时间:2024/04/30 00:57

  还在为所做的系统加载过慢,过卡而发愁吗?不知道多线程,你就out了。最近用了大概两三天的时间,研究多线程。通过小组的交流,对多线程有了更加深入的思考。希望能够加到ITOO项目里面,优化一下系统性能。


概念

   线程是程序中的一个单一的顺序控制流。进程内一个相对独立,可调度的执行单元件,是系统独立调度和分派CPU的基本单位值运行总的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。

  

基础


   线程需要引入.NET程序集System.Threading;上面写了一个简单线程的状态和状态之间转换需要调用的方法。几个常用的属性、方法:

         

   

   

   如果希望看的更加详细,还可以访问MSDN


实例

    用.Net最基础启多线程的方式,完成一个求100之内有多少个素数的多线程Demo。比如一个线程求1~10之内的素数个数,另一个线程求11~20之内的素数个数……然后将结果汇总,输出最终结果。

    

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace ThreadMethod{    class Program    {        static void Main(string[] args)        {            //实例化一个数组            List<int> list = new List<int>();            //开启一个线程,线程参数就是list.AddRange(GetZhishu(1,10)),返回值也为list.AddRange(GetZhishu(1,10))            Thread t = new Thread(() =>            {                list.AddRange(GetZhishu(1, 10));            });            //开启线程T            t.Start();                    Thread t1 = new Thread(() =>            {                list.AddRange(GetZhishu(10, 20));            });                  t1.Start();            Thread t2 = new Thread(() =>            {                list.AddRange(GetZhishu(20, 30));            });            t2.Start();            Thread t3 = new Thread(() =>            {                list.AddRange(GetZhishu(30, 40));            });            t3.Start();            Thread t4 = new Thread(() =>            {                list.AddRange(GetZhishu(40, 50));            });            t4.Start();            Thread t5 = new Thread(() =>            {                list.AddRange(GetZhishu(50, 60));            });            t5.Start();            Thread t6 = new Thread(() =>            {                list.AddRange(GetZhishu(60, 70));            });            t6.Start();            Thread t7 = new Thread(() =>            {                list.AddRange(GetZhishu(70, 80));            });            t7.Start();            Thread t8 = new Thread(() =>            {                list.AddRange(GetZhishu(80, 90));            });            t8.Start();            Thread t9 = new Thread(() =>            {                list.AddRange(GetZhishu(90, 100));            });            t9.Start();            //线程休眠0.1s            Thread.Sleep(100);            //循环数组list,并打印            foreach (var item in list)            {                Console.WriteLine(item);            }            Console.Read();        }        /// <summary>        /// 获取质数的方法        /// </summary>        /// <param name="start">获取质数范围的起始值</param>        /// <param name="end">获取质数范围的终止值</param>        /// <returns>质数的List集合</returns>        static List<int> GetZhishu(int start, int end)        {            int i, j; //定义两个变量i,j            List<int> list = new List<int>();//实例化int类型的list集合            //质数除1和本身不能被其他数整除,让每个数除以它一半以前的数,如果不能被前半段整除,就肯定不能被后半段整除,把结果添加到list集合里面            for (i = start; i < end; i++)            {                for (j = 2; j <= i / 2; j++)                {                    if (i % j == 0)                        break;                }                if (j > i / 2)                    list.Add(i);            }            return list;        }    }}

    思路就是首先开启10个线程,分为十个不同的数据段,然后每个线程都通过Lambda式将委托的方法当做参数传入到线程里面。传入完成后,线程休眠0.1s,然后通过循环打印输出结果。 写的算法还有点小缺陷,2,3也为质数,没能加到算法里面,还有待改进。


拓展

    Java和.NET的多线程基本类似,不过Java跟.NET线程也有不同的地方,Java种的Fork/Join框架是将一根任务分解成不同的线程来执行,一个线程执行完成后,还可以帮助其他的线程执行任务。但是在.NET这边更加侧重线程的安全性,不允许访问其他的线程。

    多线程、分布式都体现了一种分治的思想,把复杂问题简单化,大任务分解成小任务。另外线程里面的锁和分布式事务结合起来。比方说,两个人同时取同一张银行卡的钱,多线程可以给该线程加锁,防止其他的线程进入,造成透支。如果进行转账操作,A账户钱减少,B账户钱增加,必须做成事务,保证数据的一致性。

    另外多线程也不一定意味着高效。线程之间的资源是可以共享的,如果开启的线程过多,就像一个超市的打包的员工,同时为2个收银员打包,效率还不错;要是同时为200个收银员服务,那跑路的时间就很奢侈了。

    多线程的适用范围:1.不阻断主线程,实现即时响应,由后台线程完成即时操作 2.多个线程,完成同类任务,提高并发性 3.一个任务多个步骤,多线程执行各自任务。


总结

    总以为自己跟大牛的差距很大,不要以为完了就算了,用行动来证明团队的力量是伟大的。

    



0 0
原创粉丝点击