我不知道你是在一个多线程out该--【ITOO】

  仍向系统负载作出太慢。卡而发愁太?我不知道多线程,你们out该。最近花了大约两三天。多-threaded。通过团队的交流,多线程有更深入的思考。希望可以加入ITOO目里面,优化一下系统性能。

概念

   线程是程序中的一个单一的顺序控制流。进程内一个相对独立,可调度的执行单元件。是系统独立调度和分派CPU的基本单位值执行总的程序的调度单位。

在单个程序中同一时候执行多个线程完毕不同的工作,称为多线程。

  

基础

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ21laTQ5Njg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

假设希望看的更加具体,还能够訪问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.一个任务多个步骤,多线程运行各自任务。

总结

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

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

时间: 2024-12-21 10:42:05

我不知道你是在一个多线程out该--【ITOO】的相关文章

Linux多线程实践(1) --线程理论

线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分(非常少O(∩_∩)O~)数据,如线程ID.程序计数器.一组寄存器.堆栈.errno(错误代码).信号状态.优先级等; 3.一个进程内部的线程可以共享资源,如代码段.数

Linux多线程实践(一)线程基本概念和理论

线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 对于每个进程至少有一个执行线程; 进程  VS. 线程  1.进程是资源分配(进程需要参与资源的竞争)的基本单位,而线程是处理器调度(程序执行)的最小单位; 2.线程共享进程数据,但也拥有自己的一部分数据,如 线程ID.一组寄存器.堆栈.errno(错误代码).信号状态.优先级等; 3.一个进程内部的线程可以共享资源,如代码段.数据段.打开文件和信号等(如下图所

Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二部分将第一部分的示例进行扩展,展示了如何在python中调用多线程的C模块:第三部分扩展了第二部分,增加了在C模块的线程中回调python的演示. 本文所用的环境为:64位Win7 + python 3.4 x86 + vs2010 一.windows下的C语言多线程程序 windows下多线程编程

多线程问题与double-check

在一个多线程程序中,如果共享资源同时被多个线程使用,就有可能会造成多线程问题,这主要取决于针对该资源的某项操作是否是线程安全的.例如,.Net中的dictionary就是一个完全线程不安全的数据结构,对于dictionary的插入.删除都有可能带来多线程问题,这主要是由于dictionary的内部实现结构会频繁的由于插入.删除操作而改变长度,这时,如果出现多线程问题,程序最可能抛出数组越界的Exception.特别的,对于WebService来讲,每一个请求都会生成一个thread/instan

php的多线程使用

PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. 在liunx下的安装 准备工作: 1.下载Threading for PHP安装包https://github.com/krakjoe/pthreads 2.php安装包 php安装时一定要加上--enable-maintainer-zts参数    这个是安全线程 yum install php-devel php-pear httpd-devel

多线程编程之原子锁

在<多线程编程之数据访问互斥>一文中简单介绍了原子锁,这里再详细说一下原子锁的概念和用途. (1)简单数据操作 如果在一个多线程环境下对某个变量进行简单数学运算或者逻辑运算,那么就应该使用原子锁操作.因为,使用临界区.互斥量等线程互斥方式将涉及到很多操作系统调用和函数调用等,效率肯定不如原子操作高.比如有这样一个例子: unsigned int count = 0; int data_process() { if(/* conditions */){ EnterCriticalSection(

29、Java并发性和多线程-非阻塞算法

以下内容转自http://ifeve.com/non-blocking-algorithms/: 在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法.在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的. 为了更好的理解阻塞算法和非阻塞算法之间的区别,我会先讲解阻塞算法然后再讲解非阻塞算法. 阻塞并发算法 一个阻塞并发算法一般分下面两步: 执行线程请求的操作 阻塞线程直到可以安全地执行操作 很多算法和并发数据结构都是阻塞的.

27、Java并发性和多线程-CAS(比较和替换)

以下内容转自http://ifeve.com/compare-and-swap/: CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值.这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让我们跟深入的了解一下这项技术. CAS的使用场景 在程序和算法中一个经常出现的模式就是“check and act”模式.先检查后操作模

Linux多线程编程小结

 Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序设计第3版>. 1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量.文件描写叙述符.信号句柄和当前文件夹状态. Linux通过fork创建子进程与创建线程之间是有差别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的