.Net组件程序设计之线程、并发管理(一)

1.线程

  • 线程

  • 线程的创建

  • 线程的阻塞

    • 线程挂起

    • 线程睡眠

    • 加入线程

    • 线程中止

现在几乎所有的应用程序都是多线程的,给用户看来就是一个应用程序界面(应用程序线程),不管什么操作都不会导致界面出现响应慢的情况,这些都是多线程的功劳,有了多线程,可以让应用程序尽最大可能的处理更多的操作,调动很多线程来并行处理请求,这样会使得应用程序有更大的系统吞吐量。

1.线程

1.1线程

线程是什么呢?线程就是进程中的一条执行路径,每个应用程序至少在一个线程上运行。在本篇中将会对线程稍作讲解.

在.NET中,线程是执行的基本单元。在.NET中的线程并非是操作系统中的物理线程,而是对物理线程的托管代码表示。

在.NET System.Threading命名空间下,有个Thread类型的类,它就是代表着托管线程。

1.2线程的创建

我们直接来看下线程创建的示例:

     public class ThreadingMethodCase
{
public static void ThreadingMethod()
{
Thread thread = Thread.CurrentThread;
int threadid = thread.ManagedThreadId;
Console.WriteLine(thread.Name + "ThreadID is " + threadid);
}
}
 ThreadStart threadstart = new ThreadStart(ThreadingMethodCase.ThreadingMethod);
Thread thread = new Thread(threadstart);
thread.Name = "SubThread";
thread.Start();

在.NET中创建一个线程首先需要线程方法,什么叫线程方法?首先线程是一个操作或是一组操作的表示,线程方法就是前面这句话中的【操作】。
这里先看一下Thread类型的构造函数接受了一个ThreadStart类型的无参数委托,这个是好理解的。
线程创建了必须要显示的调用它的Start()函数才能开始执行线程。调用Strat()函数是不会对当前线程造成阻塞的,就是说在调用了之后控制权会立刻的回到当前的线程的客户端中。

1.3线程的阻塞

1.3.1线程挂起

 public sealed class Thread
{
public void Suspend();
public void Resume();
……
}

Suspend()方法是挂起线程的执行.

Resume()方法则是释放挂起的线程,让线程继续执行在调用Suspend()方法的时候,是不会造成当前线程阻塞的,在调用后,控制权立即返回的,而且在要被挂起的线程中, 也不是被立即挂起的,而是在执行到一个安全点的时候,才会执行挂机操作的。什么是安全点?举个例子吧,假如要被挂起的线程中 正在执行一个函数的时候,外部被通知命令,要被挂起,这个时候线程是不会被挂起的,当这个函数执行完毕的时候,线程则会被挂起, 假设编辑器是把安全点插设在每个函数的末端的。

.NET中是不推荐我们使用这两个函数的,因为会造成很多方面的不稳定。

1.3.2线程睡眠

 public sealed class Thread
{
public static void Sleep(int millisecondsTimeout);
public static void Sleep(TimeSpan timeout);
……
}

Sleep()是静态函数,是一个阻塞调用并且使当前线程放弃CPU时间片,就是在休眠指定的时间后,控制权才会返回到调用的线程。

Thread.Sleep(20);//让当前调用线程休眠20毫秒

Thread类还提供了另一种类似于休眠的操作:

 public static void SpinWait(int iterations);

调用SpinWait()也是会造成当前阻塞的,但是当前线程不会放弃CPU时间片,而是在等待有限的时间(参数设置)后继续执行, 这种函数是在可控的情况下才去这样调用的,比如说当前线程要使用一个资源,而这个资源在被其他线程使用,那么就可以使用 SpinWait()函数,在等待有限的时间后,再去读取资源,如果资源还没被其他线程释放,当前线程也会继续执行,所有这是用于可控的情况下的方法。

1.3.3 加入线程

Thread类的Join()方法可以让一个线程等待另一个线程的终结。

这句定义什么意思呢?说是说不清的,来看一下Thread.Join()示例代码  :

     public class StudyCase
{
public void ThreadingTest()
{
ThreadStart threadstart = new ThreadStart(ThreadingMethodCase.ThreadingMethod);
Thread thread = new Thread(threadstart);
thread.Name = "newThread";
Thread.CurrentThread.Name = "CurrentThread";
for (int i = ; i < ; i++)
{
if (i == )
{
thread.Start();
thread.Join();
}
Console.WriteLine(Thread.CurrentThread.Name+"_"+i.ToString());
}
} }
     public class ThreadingMethodCase
{
public static void ThreadingMethod()
{
Thread thread = Thread.CurrentThread;
int threadid = thread.ManagedThreadId;
Console.WriteLine(thread.Name + "ThreadID is " + threadid);
}
}

从上图的结果再结合代码看一下,就大概的清楚了Join的意思了,意义就是阻塞当前线程,等待子线程(ThreadingTest函数中的thread变量)执行完毕时,当前线程再执行。

1.3.4线程中止

调用Thread类型提供的Abort()方法可以中止线程的运行,并且被中止的线程会抛出一个ThreadAbortException类型的异常。下面的示例代码会清晰的描述和示例代码结果图。
来看示例代码:

     public class ThreadingMethodCase
{
public static void ThreadingMethodDiv()
{
try
{
while (true)
{
Console.WriteLine("测试子线程中止");
}
}
catch (ThreadAbortException abex)
{
Console.WriteLine(Thread.CurrentThread.Name+"-子线程内部-" + abex.Message);
}
}
}
public class StudyCase
{
public void ThreadingTestAbort()
{
Thread.CurrentThread.Name="CurrentThread";
ThreadStart threadstart = new ThreadStart(ThreadingMethodCase.ThreadingMethod);
Thread thread = new Thread(threadstart);
thread.Name = "newThread"; thread.Start();
for (int i = ; i < ; i++)
{
Console.WriteLine(i.ToString());
}
thread.Abort();
thread.Join(); Console.WriteLine("当前线程");
} }

将在下一章讲解线程同步。

作者:金源

出处:http://www.cnblogs.com/jin-yuan/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

.Net组件程序设计之线程、并发管理(一)的更多相关文章

  1. .NET组件程序设计之线程、并发管理(二)

    .Net组件程序设计之线程.并发管理(二) 2.同步线程 手动同步 监视器 互斥 可等待事件 同步线程 所有的.NET组件都支持在多线程的环境中运行,可以被多个线程并发访问,如果没有线程同步,这样的后 ...

  2. .Net组件程序设计之上下文

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  3. .Net组件程序设计之异步调用

    .Net组件程序设计之异步调用 说到异步调用,在脑海中首先想到就是BeginInvoke(),在一些常用对象中我们也会常常见到Invoke()和BeginInvoke(), 要想让自己的组件可以被客户 ...

  4. (转载)JAVA线程池管理

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  5. Spring如何处理线程并发

    Spring如何处理线程并发   我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我 ...

  6. .Net组件程序设计

    .Net组件程序设计之上下文 在后续篇幅的远程调用的文章里有说到应用程序域,那是大粒度的控制程序集的逻辑存在,那么想对对象的控制又由谁来做主呢?没错了,就是上下文.CLR把应用程序域更细化了,在应用程 ...

  7. [C#网络应用编程]2、对线程的管理

    在System.Threading命名空间下,有一个Thread类,用于对线程进行管理,如创建线程.启动线程.终止线程.合并线程.让线程休眠等 Thread类 (假设Thread firTh = ne ...

  8. Java线程池管理及分布式Hadoop调度框架搭建

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发工程师却在这个上面吃了不少苦头. 怎么做一套简便的线程开发模 ...

  9. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

随机推荐

  1. RSA密钥之C#格式与Java格式转换

    前言 最近由于项目需求,服务端由c#编写,客户端由java编写.通信数据使用RSA非对称加密.但是java和c#生成的密钥格式是不一样的,所以需要转换格式才可以正常使用.网上搜到使用java进行格式转 ...

  2. iOS多播放器封装

    今年在做直播业务的时候遇到一些问题,就是在一个套播放器UI中需要多种不同的播放器(AVPlayer.IJKPlayer.AliPlayer)支持,根据ABTest开关来切换具体使用哪种播放器,并且还要 ...

  3. RPC框架性能基本比较测试

    RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...

  4. 如何使用android百度地图离线地图

    1.首先把离线地图放在android工程下的assets里面. 注意:建议离线地图下载通过百度地图APIDEMO去下载,因为到官网上下载的离线地图文件格式不一样,APIDEMO的格式是.dat,而官网 ...

  5. LINUX 查看当前系统的内存使用情况

    # free 显示结果如下: Mem:表示物理内存统计 total 内存总数 8057964KB used 已使用的内存 7852484KB free 空闲的内存数 205480KB shared 当 ...

  6. C练习

    int main() { int a; //scanf函数只接受变量的地址 //scanf函数是一个阻塞式的函数,等待用户输入 // 用户输入完成后,就会将用户输入的值赋值给变量a //函数调用完毕 ...

  7. md语法

    标题 标题 标题是每篇文章都需要也是最常用的格式,在 Markdown 中,如果一段文字被定义为标题,只要在这段文字前加 # 号即可. # 一级标题 ## 二级标题 ### 三级标题 以此类推,总共六 ...

  8. .NET Web开发笔记

    HttpWebRequest HttpWebRequest默认关闭Cookies,给其赋初始值以打开Cookies读写 myRequest.CookieContainer = new CookieCo ...

  9. 在CentOS 7中安装与配置JDK8

    参考命令:http://www.jb51.net/os/RedHat/73016.html来进行安装 安装说明 系统环境:centos7 安装方式:rpm安装 软件:jdk-8u25-linux-x6 ...

  10. Codeforces Round #260 (Div. 2)

    A. Laptops 题目意思: 给定n台电脑,第i台电脑的价格是ai ,质量是bi ,问是否存在一台电脑价格比某台电脑价格底,但质量确比某台电脑的质量高,即是否存在ai < aj 且 bi & ...