C#秘密武器之多线程——基础
多线程概述
什么是进程?
当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。
什么是线程?
线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
什么是多线程?
多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
多线程的好处
可以提高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#秘密武器之多线程——基础的更多相关文章
- C#秘密武器之多线程——参数与返回值
		线程函数要么没有参数,要么只能有一个object参数,而且均没有返回值,这样就大大降低了程序的灵活性,其实我们想要的是能像普通方法一样正常使用参数和返回值!能不能实现这个需求呢?下面就介绍两种方法 一 ... 
- C#秘密武器之反射——基础篇
		先来一段有用的反射代码 namespace Calculator { public interface Iwel { String Print(); } } namespace Calculator ... 
- TypeScript: Angular 2 的秘密武器(译)
		本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ... 
- Java基础知识笔记(四:多线程基础及生命周期)
		一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ... 
- Java多线程干货系列—(一)Java多线程基础
		前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ... 
- 第一章-第七题( 有人认为,“中文编程”, 是解决中国程序员编程效率一个秘密武器,请问它是一个 “银弹” 么? )--By 侯伟婷
		首先,“银弹”在百度百科中的解释是银色的子弹,我们更熟知的“银弹”一词,应该是在<人月神话>中提到的.银弹原本应该是指某种策略.技术或者技巧可以极大地提高程序员的生产力[1].此题目中关于 ... 
- JAVASE02-Unit010: 多线程基础 、 TCP通信
		多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ... 
- JAVASE02-Unit09: 多线程基础
		Unit09: 多线程基础 * 线程 * 线程用于并发执行多个任务.感官上像是"同时"执行 * * 创建线程有两种方式. * 方式一: * 继承线程并重写run方法来定义线程要执 ... 
- java多线程基础
		多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ... 
随机推荐
- python模块之HTMLParser
			HTMLParser是python用来解析html的模块.它可以分析出html里面的标签.数据等等,是一种处理html的简便途径. HTMLParser采用的是一种事件驱动的模式,当HTMLParse ... 
- 嵌套循环连接(Nested Loops Joins)
			The nested loops join, also called nested iteration, uses one join input as the outer input table(sh ... 
- 【BFS】The New Villa
			[poj1137] The New Villa Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 1481 Accepted ... 
- BZOJ 3399 [Usaco2009 Mar]Sand Castle城堡(贪心)
			[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3399 [题目大意] 将一个集合调整成另一个集合中的数,把一个数+1需要消耗x,-1需要 ... 
- 【点分治】Osipovsky Cup 2014 Kovrov, Sunday, December 21, 2014 Problem A. Attack and Defence
			题意:给你一棵树,每个点有一个左括号或者右括号,问你树上能够完美匹配的路径数量(l->r,r->l 视作不同路径). 点分治可以使用“不扣去重复答案”的写法,只不过,要先将每个点的子树按照 ... 
- 实验四实验报告————Android基础开发
			实验四实验报告----Android基础开发 任务一 关于R类 关于apk文件 实验成果 任务二 活动声明周期 实验成果 任务三 关于PendingIntent类 实验成果 任务四 关于布局 实验成果 ... 
- maven打包出现找不到java.lang包的问题
			修改pom文件中的bootclasspth路径为${java.home}/lib/rt.jar;${java.home}/lib/jce.jar windows为分号 linux为冒号 
- I/O多路复用机制:epoll
			在过去的linux 网络编程中,采用select来做事件触发,其缺点在于每次调用select,都需要把fd集合拷贝到内核,内核必须遍历传递进来的所有fd,这在fd很多时开销会很大,相比于select, ... 
- Failed to Attach to Process ID Xcode 解决办法
			方法1. go to the Product menu and find the Edit Scheme menu there. While in Edit Scheme window, select ... 
- .net设置中GridView自适应列宽
			有一个项目只有30分钟开发时间,速成,使用了古老的.net gridview. 但需要列宽自适应好看些. 于是琢磨了,实现思路如下. 先看下大致效果(很粗暴没有优化) 代码如下: protected ... 
