线程是操作系统分配处理器时间的基本单元,并且进程中可以有多个线程同时执行代码。 每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。 线程上下文包括为使线程在线程的宿主进程地址空间中无缝地继续执行所需的所有信息,包括线程的 CPU 寄存器组和堆栈。

.NET Framework 将操作系统进程进一步细分为由 System.AppDomain 表示的、称为应用程序域的轻量托管子进程。 一个或多个托管线程(由System.Threading.Thread 表示)可以在同一个托管进程中的一个或任意数目的应用程序域中运行。 虽然每个应用程序域都是用单个线程启动的,但该应用程序域中的代码可以创建附加应用程序域和附加线程。 其结果是托管线程可以在同一个非托管进程中的应用程序域之间自由移动;您可能只有一个线程在若干应用程序域之间移动。

支持抢先多任务处理的操作系统可以创建多个进程中的多个线程同时执行的效果。 它通过以下方式实现这一点:在需要处理器时间的线程之间分割可用处理器时间,并轮流为每个线程分配处理器时间片。 当前执行的线程在其时间片结束时被挂起,而另一个线程继续运行。 当系统从一个线程切换到另一个线程时,它将保存被抢先的线程的线程上下文,并重新加载线程队列中下一个线程的已保存线程上下文。

时间片的长度取决于操作系统和处理器。 由于每个时间片都很小,因此即使只有一个处理器,多个线程看起来似乎也是在同时执行。 这实际上就是多处理器系统中发生的情形,在此类系统中,可执行线程分布在多个可用处理器中。

何时使用多个线程

需要用户交互的软件必须尽可能快地对用户的活动作出反应,以便提供丰富多彩的用户体验。 但同时它必须执行必要的计算以便尽可能快地将数据呈现给用户。 如果应用程序仅使用一个执行线程,则可以将异步编程.NET Framework 远程处理或使用 ASP.NET 创建的 XML Web services 结合使用,在使用自己的计算机的处理时间之外还使用其他计算机的处理时间,从而提高对用户的响应速度并减少应用程序的数据处理时间。 如果您正在进行大量的输入/输出工作,则还可以使用 I/O 完成端口来提高应用程序的响应速度。

多个线程的优点

无论如何,要提高对用户的响应速度并且处理所需数据以便几乎同时完成工作,使用多个线程是一种最为强大的技术。 在具有一个处理器的计算机上,多个线程可以通过利用用户事件之间很小的时间段在后台处理数据来达到这种效果。 例如,在另一个线程正在重新计算同一应用程序中的电子表格的其他部分时,用户可以编辑该电子表格。

无需修改,同一个应用程序在具有多个处理器的计算机上运行时将极大地满足用户的需要。 单个应用程序域可以使用多个线程来完成以下任务:

  • 通过网络与 Web 服务器和数据库进行通信。

  • 执行占用大量时间的操作。

  • 区分具有不同优先级的任务。 例如,高优先级线程管理时间关键的任务,低优先级线程执行其他任务。

  • 使用户界面可以在将时间分配给后台任务时仍能快速做出响应。

多个线程的缺点

建议您使用尽可能少的线程,这样可以最大限度地减少操作系统资源的使用,并可提高性能。 线程处理还具有在设计应用程序时要考虑的资源要求和潜在冲突。 这些资源要求如下所述:

  • 系统将为进程、AppDomain 对象和线程所需的上下文信息使用内存。 因此,可以创建的进程、AppDomain 对象和线程的数目会受到可用内存的限制。

  • 跟踪大量的线程将占用大量的处理器时间。 如果线程过多,则其中大多数线程都不会产生明显的进度。 如果大多数当前线程处于一个进程中,则其他进程中的线程的调度频率就会很低。

  • 使用许多线程控制代码执行非常复杂,并可能产生许多 bug。

  • 销毁线程需要了解可能发生的问题并对那些问题进行处理。

提供对资源的共享访问会造成冲突。 为了避免冲突,必须对共享资源进行同步或控制对共享资源的访问。 如果在相同或不同的应用程序域中未能正确地使访问同步,则会导致出现一些问题,这些问题包括死锁和争用条件等,其中死锁是指两个线程都停止响应,并且都在等待对方完成;争用条件是指由于意外地出现对两个事件的执行时间的临界依赖性而发生反常的结果。 系统提供了可用于协调多个线程之间的资源共享的同步对象。 减少线程的数目使同步资源更为容易。

需要同步的资源包括:

  • 系统资源(如通信端口)。

  • 多个进程所共享的资源(如文件句柄)。

  • 由多个线程访问的单个应用程序域的资源(如全局、静态和实例字段)。

线程处理与应用程序设计

一般情况下,要为不会阻止其他线程的相对较短的任务处理多个线程并且不需要对这些任务执行任何特定调度时,使用 ThreadPool 类是一种最简单的方式。 但是,有多个理由创建您自己的线程:

  • 如果您需要使一个任务具有特定的优先级。

  • 如果您具有可能会长时间运行(并因此阻止其他任务)的任务。

  • 如果您需要将线程放置到单线程单元中(所有 ThreadPool 线程均处于多线程单元中)。

  • 如果您需要与该线程关联的稳定标识。 例如,您应使用一个专用线程来中止该线程,将其挂起或按名称发现它。

  • 如果您需要运行与用户界面交互的后台线程,.NET Framework 2.0 版提供了 BackgroundWorker 组件,该组件可以使用事件与用户界面线程的跨线程封送进行通信。

线程处理和异常

在线程中执行异常处理。 线程(甚至是后台线程)中的未经处理的异常通常会终止进程。 以下为此规则的三种例外情况:

.NET并行处理和并发1-Threads and Theading的更多相关文章

  1. 07.并发编程Threads

    参考文档 https://www.cnblogs.com/springsnow/p/9409205.html#_label0 1. 基础概念 1.1 进程/线程/多线程 进程(Process) 计算机 ...

  2. 并发 并行 进程 线程 协程 异步I/O python async

    一些草率不精确的观点: 并发: 一起发生,occurence: sth that happens. 并行: 同时处理. parallel lines: 平行线.thread.join()之前是啥?落霞 ...

  3. 14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发

    14.4.6 Configuring Thread Concurrency for InnoDB 配置Thread 并发 InnoDB 使用操作系统threads 来处理用户的事务请求.(事务可以执行 ...

  4. Go语言并发机制初探

    Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处理器资源.这篇文章学习 g ...

  5. python 并发和线程

    并发和线程 基本概念 - 并行.并发 并行, parallel 互不干扰的在同一时刻做多件事; 如,同一时刻,同时有多辆车在多条车道上跑,即同时发生的概念. 并发, concurrency 同时做某些 ...

  6. Go语言并发

    Go语言并发机制初探   Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处 ...

  7. 浅谈文件断点续传和WebUploader的基本结合

    0.写在前面的话 上篇博客已经是在8月了,期间到底发生了什么,只有我自己知道,反正就是心情特别糟糕,生活状态工作状态学习状态都十分不好,还有心思进取吗,No!现在状态好起来了,生活又充满了希望 :D  ...

  8. AngularJS封装webupload实现文件夹上传

    百度的webupload没有开放api获取整个文件夹的信息.本文是二次开发webupload实现获取文件夹信息. 指令封装 /** * @license lx.ui.framework v1.0.0 ...

  9. 巧用 Jersey RESTful WebService框架解决文件上传乱码

    一.当我们使用jersey框架封装的restful进行文件上传时,会出现中文乱码,试用了过滤器设置编码都不管用.仔细想了很久解决办法,就用一个servelt来代替这个上传的restful接口实现上传的 ...

随机推荐

  1. 第1章 ssh和SSH服务(包含隧道内容)

    本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...

  2. window.onload的使用心得

    如果我问你window.onload是什么意思,恐怕你会回答我:"这不是页面加载完就执行吗".  但是答案是不一定,得看你怎么用.看一下例子吧 例1:  代码如下:   <! ...

  3. java 关于 hashmap 的实现原理的测试

    网上关于HashMap的工作原理的文章多了去了,所以我也不打算再重复别人的文章.我就是有点好奇,我怎么样能更好的理解他的原理,或者说使用他的特性呢?最好的开发就是测试~ 虽说不详讲hashmap的工作 ...

  4. 【Storm】Storm实战之频繁二项集挖掘

    一.前言 针对大叔据实时处理的入门,除了使用WordCount示例之外,还需要相对更深入点的示例来理解Storm,因此,本篇博文利用Storm实现了频繁项集挖掘的案例,以方便更好的入门Storm. 二 ...

  5. JavaScript一个猜数字游戏

    效果图: 代码: <body> <script type="text/javascript"> window.onload = newgame; //页面载 ...

  6. Office365开发系列——开发一个全功能的Word Add-In

    2016年10月我参加了在北京举行的DevDays Asia 2016 - Office 365应用开发”48小时黑客马拉松“,我开发的一个Word Add-In Demo——WordTemplate ...

  7. LFCP

    场景:总结LFCP项目开发中遇到的问题! 1 运营支撑 项目结构: 1.1 hessian配置 服务端实现: 客户端调用: 1.2 问题排查 之前一段时间,运营支撑项目能够正常运行,中间有其它事情要做 ...

  8. CentOS5.5中卸载自带jdk 安装自己的jdk

    因为需要使用JDK1.6的版本,但是RedHat6.4自带的JDK是1.7版本,因此需要卸载JDK1.7,安装JDK1.6的版本,我使用的JDK1.6版本为:jdk-6u45-Linux-x64.bi ...

  9. 一.CPU,Mem过高怎么办 --这是个开始

    本身是名Java开发,在做了一段大数据的工作后,猛然间想对Java做个总结. 从未写过技术博客,一时不知如何开始,思虑后,暂且以自己喜爱的方式来开篇. 工作中遇到过CPU或内存过高的问题,解决步骤: ...

  10. Java 9 揭秘(20. JDK 9中API层次的改变)

    Tips 做一个终身学习的人. 在最后一章内容中,主要介绍以下内容: 下划线作为新关键字 改进使用try-with-resources块的语法 如何在匿名类中使用<>操作符 如何在接口中使 ...