多线程概述

什么是进程?

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。

什么是线程?

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处

可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

多线程的不利方面

线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug;

.NET中的多线程

一、创建线程

我们可以使用Thread类的构造函数创建线程,用无参数的TheadStart委托或者带有一个参数的ParameterizedTheadStart委托作为构造函数的参数即可。线程执行其实就是执行里边的线程函数——即里边的委托函数!

public delegate void ThreadStart();
public delegate void ParameterizedThreadStart(object obj);

举个栗子:

static void Main()
{
Thread t = new Thread(new TheadStart(Go));
//Thread t = new Thead(Go);
t.Start();
}
static void Go()
{
Console.Write("hello!");
} static void Main()
{
Thread t = new Thread(Go);
t.Start("hello");
Go();
}
static void Go(object msg)
{
string message = (string)msg;
Console.Write(message);
}

二、启动线程

start():将当前线程的状态更改为 ThreadState.Running。

一旦线程处于 ThreadState.Running 状态,操作系统就可以安排其执行。 线程从方法的第一行(由提供给线程构造函数的 ThreadStart 或 ParameterizedThreadStart 委托表示)开始执行。线程一旦终止,它就无法通过再次调用 Start 来重新启动。

三、线程睡眠

Thread.Sleep(int ms);
Thread.Sleep(TimeSpan timeout);

上述方法为Thread类的两个静态方法,用来阻止当前线程指定的时间。

四、终止线程

使用Abort方法实现,用于永久地停止托管线程。一旦线程被中止,它将无法重新启动。Abort会引发ThreadAbortException异常,同时可以传递一个终止的参数信息。

Thread.Abort();
Thread.Abort(Object stateInfo);

注意:Suspend和Resume为废弃方法,不要使用!

五、线程属性

5.1、线程名字

每个线程都有一个Name属性,可以设置和修改,但是只能设置一次。

5.2、后台线程

在.net中线程分为前台线程和后台线程,在一个进程中,当所有前台线程停止运行时,CLR会强制结束仍在运行的任何后台线程,这些后台线程直接被终止,不会抛出异常。所以我们应该在前台线程中执行我们确实要完成的事情!

static void Main(string[] args)
{
Thread t = new Thread(Test);
t.IsBackground = true;
//这里线程是后台线程,应用程序马上结束
//假如是前台线程,大约5秒以后结束
t.Start();
Console.WriteLine("A");
}
static void Test()
{
Thread.Sleep( * );
Console.WriteLine("B");
}

5.3、线程优先级

线程的优先级使用Priority设置或获取,只有在运行时才有作用,分为5个级别:

enum ThreadPriority{Lowest, BelowNormal , Normal, AboveNormal, Highest}

举个栗子:

myThread.Priority=ThreadPriority.Lowest;

注意:优先等级高的线程占用更多的CUP时间。 但是当优先等级高的线程正在等待一些资源的时候,优先等级低的线程可以运行。

六、阻塞线程

阻塞某个线程用的方法是join()。这个方法可以让并发处理变得串行化,让主线程去等待某个线程执行完毕才继续往下执行!

class Test
{
static void Main()
{
Thread t = new Thread(Run); t.Start(); //Join相当于把Run方法内嵌如此
t.Join(); //该死的t.Join(),害的我主线程必须在你执行完后才能执行。
Console.WriteLine("我是主线程:" + Thread.CurrentThread.GetHashCode());
} static void Run()
{
//等待5s
Thread.Sleep(); Console.WriteLine("我是线程:" + Thread.CurrentThread.GetHashCode());
}
}

七、线程的异常处理

线程的异常都是在线程函数里边解决的,因此应该把try catch放在线程的委托函数里边~

static void Main(string[] args)
{
try
{
new Thread(Go).Start();
}
catch (Exception ex)
{
Console.Write(ex.Message);
} Console.ReadKey();
}
static void Go()
{
try
{
///处理逻辑
}
catch(Exception e)
{
Console.Write(e.Message);
}
}

注意:在调用Abort方法终止一个线程时,在异常处理的时候为了防止程序再次抛出异常,在catch里边处理完异常之后最好加上Thread.ResetAbort();这条语句!

C#秘密武器之多线程——基础的更多相关文章

  1. C#秘密武器之多线程——参数与返回值

    线程函数要么没有参数,要么只能有一个object参数,而且均没有返回值,这样就大大降低了程序的灵活性,其实我们想要的是能像普通方法一样正常使用参数和返回值!能不能实现这个需求呢?下面就介绍两种方法 一 ...

  2. C#秘密武器之反射——基础篇

    先来一段有用的反射代码 namespace Calculator { public interface Iwel { String Print(); } } namespace Calculator ...

  3. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

  4. Java基础知识笔记(四:多线程基础及生命周期)

    一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...

  5. Java多线程干货系列—(一)Java多线程基础

    前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...

  6. 第一章-第七题( 有人认为,“中文编程”, 是解决中国程序员编程效率一个秘密武器,请问它是一个 “银弹” 么? )--By 侯伟婷

    首先,“银弹”在百度百科中的解释是银色的子弹,我们更熟知的“银弹”一词,应该是在<人月神话>中提到的.银弹原本应该是指某种策略.技术或者技巧可以极大地提高程序员的生产力[1].此题目中关于 ...

  7. JAVASE02-Unit010: 多线程基础 、 TCP通信

    多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...

  8. JAVASE02-Unit09: 多线程基础

    Unit09: 多线程基础 * 线程 * 线程用于并发执行多个任务.感官上像是"同时"执行 *  * 创建线程有两种方式. * 方式一: * 继承线程并重写run方法来定义线程要执 ...

  9. java多线程基础

    多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ...

随机推荐

  1. 一个通用的php正则表达式匹配或检测或提取特定字符类

      在php开发时,日常不可或缺地会用到正则表达式,可每次都要重新写,有时忘记了某一函数还要翻查手册,所以,抽空写了一个关于日常所用到的正则表达式区配类,便于随便移置调用.(^_^有点偷懒). /*/ ...

  2. urllib2模块、cookielib模块

    urllib2模块 urllib模块和urllib模块类似,用来打开URL并从中获取数据.与urllib模块不同的是,urllib模块不仅可以使用urlopen() 函数还可以自定义Opener来访问 ...

  3. Codeforces 1 C. Ancient Berland Circus-几何数学题+浮点数求gcd ( Codeforces Beta Round #1)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  4. 【转载】RecyclerView源码解析

    原文地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html 概述 之前面试的时候经常有人问是否用过Re ...

  5. Web开发中的路径问题总结

    原文地址:http://zzqrj.iteye.com/blog/806909 路径问题在Web开发中算是令人比较蛋疼的问题,尤其是用相对地址时,同样的代码,在不同的目录结构中竟然会出现有对有错的结果 ...

  6. coreseek 段错误 (core dumped) 问题

    coreseek建立索引出现上面问题经过测试发现有下面几个原因: 1. 分词配置文件不存在  uni.lib 2. uni.lib配置文件格式不正确

  7. 新浪微博(t.sina)简单授权代码及API测试

    http://www.eoeandroid.com/thread-53701-1-1.html package mobson.weiboku.view; import java.util.ArrayL ...

  8. 在Linux系统环境下修改MySQL的root密码

    root用户登录系统 /usr/local/mysql/bin/mysqladmin -u root -p password 新密码 enter password 旧密码 第二种方法: root用户登 ...

  9. VB里的TEXT控件只能输入数字的代码

    " '先声明一个常量,并把你想禁用或允许输入的内容赋值给它 Private Sub Text1_KeyPress(KeyAscii As Integer) '只能输入数字 KeyAscii ...

  10. VisualStudio 发布代码的一个坑

    现象:为了测试把时间改为2016-1-1,测试完成后改为实际时间.以后每次发布代码,生成的dll还是2016-1-1,而非发布时间 导致问题:生成的dll和实际代码不匹配,原因不明 解决过程: 1.修 ...