zoukankan      html  css  js  c++  java
  • 我不知道你是在一个多线程out该--【ITOO】

      仍向系统负载作出太慢。卡而发愁太?我不知道多线程,你们out该。最近花了大约两三天。多-threaded。通过团队的交流,多线程有更深入的思考。希望可以加入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.一个任务多个步骤,多线程运行各自任务。


    总结

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

        



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    MyBatis 学习记录3 MapperMethod类
    MyBatis 学习记录2 Mapper对象是如何生成的
    MyBatis 学习记录1 一个简单的demo
    hadoop学习记录1 初始hadoop
    Java枚举类的serialVersionUID
    docker学习记录1
    mysql utf8方式连接查看表数据乱码的问题
    在Spring中使用Redis Lua脚本批量删除缓存
    redis 批量删除键
    前后端分离跨域问题解决方案
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4844678.html
Copyright © 2011-2022 走看看