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

概念

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

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

  

基础

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

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

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

总结

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

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

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

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

    线程概念 在一个程序里的一个执行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 一切进程至少有一个执行线程; 进程  VS. 线程  ...

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

    线程概念 在一个程序里的一个运行路线就叫做线程(thread).更准确的定义是:线程是"一个进程内部的控制序列/指令序列"; 对于每一个进程至少有一个运行线程; 进程  VS. 线 ...

  3. 多线程编程之Linux环境下的多线程(一)

    一.Linux环境下的线程 相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型.Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程 ...

  4. C#多线程(一) 入门

    本文你会了解如下内容: 1.计算机程序.进程.线程的概念 2.多线程的概念.为什么需要多线程.多线程的好处与坏处 3.C# 线程的一些概念与操作(创建线程.像线程中传递参数.给线程取名.前后台线程.线 ...

  5. linux 多线程基础1

    一.什么是线程        在一个程序里的多个执行路线就叫做线程.更准确的定义是:线程是“一个进程内部的一个控制序列”. 典型的unix进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情. ...

  6. php的多线程使用

    PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程.多线程在处理重复性的循环任务,能够大大缩短程序执行时间. 在liunx下的安装 准备工作: 1.下载Threa ...

  7. Linux多线程编程小结

     Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序 ...

  8. linux 多线程编程笔记

    一, 线程基础知识 1,线程的概念 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行 中必不可少的资源(如程序计 ...

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

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

随机推荐

  1. 不要打开文件,阅读Rvt信息档案

    叶老师,想问一下是否能基于revit API 2014,直接在开发时传递给程序要处理的文件名称和路径.而不用再在revit软件中打开为当前活动视图,就直接获得文件里信息.这样可行不? 答: 能够.你能 ...

  2. linux下安装QT过程

    说QT是linux下主要的图形开发工具一点都不过分,虽然诺基亚公司放弃Meego.遣散了Qt开发团队,但是它的各种商业.企业版本还是的到了很好的保护,linux下的开发工具集里还是经常看到它的身影,毕 ...

  3. Struts 2.x仍然明显落后于时代。 Struts 2.x这一类老牌Web MVC开发框架仅能用于开发瘦客户端应用,无法用来开发对于交互体验要求更高的应用。

    后来我在工作中陆续使用过Struts 1.x和Struts 2.x.我曾经把一个开源的基于Struts 1.x的自助式广告联盟应用移植到Spring MVC,还基于Struts 2.x做过网站开发.S ...

  4. oracle 之 内存—鞭辟近里(二)

    overview of the pga pga是在操作系统的进程或是线程特定的一块内存区域,它不是共享的.因为pga是进程指定的,因此它不会在sga中分配. pga是一个内存堆,其中包含了被专用服务器 ...

  5. JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue

    JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue 目的:本文通过分析JDK源码来对比ArrayBlockingQueue 和LinkedBlocki ...

  6. poj3206(bfs+最小生成树)

    传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...

  7. 约瑟夫问题--list模拟循环链表

    约瑟夫问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 n个人想玩残酷的死亡游戏,游戏规则例如以下: n个人进行编号,分别 ...

  8. Android 框架炼成 教你怎样写组件间通信框架EventBus

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/41096639 .本文出自:[张鸿洋的博客] 1.概述 关于Eventbus的介绍 ...

  9. 使用cacti监控服务器

    一.cacti安装 cacti需要lamp环境,因此需要首先编译安装lamp环境,安装完成后,下载cacti的zip包,解压到/www/htdocs目录下,创建cacti需要的数据库. 完成上述后,在 ...

  10. 从零開始学android&lt;ImageSwitcher图片切换组件.二十六.&gt;

    ImageSwitcher组件的主要功能是完毕图片的切换显示,比如用户在进行图片浏览的时候.能够通过button点击一张张的切换显示的图片,并且使用ImageSwitcher组件在每次切换的时候也能够 ...