.net中 多线程 笔记(基础)
1. 在进程中可以有多个线程同时执行代码。进程之间是相对独立的,一个进程无法访问另一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域的。
2. 线程(Thread)是进程中的基本执行单元,是操作系统分配CPU时间的基本单位,一个进程可以包含若干个线程,在进程入口执行的第一个线程被视为这个进程的主线程。在.NET应用程序中,都是以Main()方法作为入口的,当调用此方法时系统就会自动创建一个主线程。多线程的优点:
可以同时完成多个任务;
可以使程序的响应速度更快;
可以让占用大量处理时间的任务或当前没有进行处理的任务定期将处理时间让给别的任务;
可以随时停止任务;
可以设置每个任务的优先级以优化程序性能。
缺点:
线程也是程序,所以线程需要占用内存,线程越多,占用内存也越多。
多线程需要协调和管理,所以需要占用CPU时间以便跟踪线程。
线程之间对共享资源的访问会相互影响,必须解决争用共享资源的问题。
线程太多会导致控制太复杂,最终可能造成很多程序缺陷。
在C#中,线程是使用Thread类处理的,该类在System.Threading命名空间中。使用Thread类创建线程时,只需要提供线程入口,线程入口告诉程序让这个线程做什么。通过实例化一个Thread类的对象就可以创建一个线程。创建新的Thread对象时,将创建新的托管线程。Thread类接收一个ThreadStart委托或ParameterizedThreadStart委托的构造函数,该委托包装了调用Start方法时由新线程调用的方法,示例代码如下:
Thread thread=new Thread(new ThreadStart(method));//创建线程
thread.Start(); //启动线程
上面代码实例化了一个Thread对象,并指明将要调用的方法method(),然后启动线程。ThreadStart委托中作为参数的方法不需要参数,并且没有返回值。
ParameterizedThreadStart委托一个对象作为参数,利用这个参数可以很方便地向线程传递参数,示例代码如下:
Thread thread=new Thread(new ParameterizedThreadStart(method));//创建线程
thread.Start(3); //启动线程
创建多线程的步骤:
           1、编写线程所要执行的方法
           2、实例化Thread类,并传入一个指向线程所要执行方法的委托。(这时线程已经产生,但还没有运行)
           3、调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //创建无参的线程
6 Thread thread1 = new Thread(new ThreadStart(Thread1));
7 //调用Start方法执行线程
8 thread1.Start();
9
10 Console.ReadKey();
11 }
12
13 /// <summary>
14 /// 创建无参的方法
15 /// </summary>
16 static void Thread1()
17 {
18 Console.WriteLine("这是无参的方法");
19 }
20 }
1 class Program
2 {
3 static void Main(string[] args)
4 {
5 //通过ParameterizedThreadStart创建线程
6 Thread thread = new Thread(new ParameterizedThreadStart(Thread1));
7 //给方法传值
8 thread.Start("这是一个有参数的委托");
9 Console.ReadKey();
10 }
11
12 /// <summary>
13 /// 创建有参的方法
14 /// 注意:方法里面的参数类型必须是Object类型
15 /// </summary>
16 /// <param name="obj"></param>
17 static void Thread1(object obj)
18 {
19 Console.WriteLine(obj);
20 }
21 }
| 属性名称 | 说明 | 
|---|---|
| CurrentContext | 获取线程正在其中执行的当前上下文。 | 
| CurrentThread | 获取当前正在运行的线程。 | 
| ExecutionContext | 获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。 | 
| IsAlive | 获取一个值,该值指示当前线程的执行状态。 | 
| IsBackground | 获取或设置一个值,该值指示某个线程是否为后台线程。 | 
| IsThreadPoolThread | 获取一个值,该值指示线程是否属于托管线程池。 | 
| ManagedThreadId | 获取当前托管线程的唯一标识符。 | 
| Name | 获取或设置线程的名称。 | 
| Priority | 获取或设置一个值,该值指示线程的调度优先级。 | 
| ThreadState | 获取一个值,该值包含当前线程的状态。 | 
.net中 多线程 笔记(基础)的更多相关文章
- Java多线程系列--“基础篇”03之  Thread中start()和run()的区别
		
概要 Thread类包含start()和run()方法,它们的区别是什么?本章将对此作出解答.本章内容包括:start() 和 run()的区别说明start() 和 run()的区别示例start( ...
 - 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)
		
一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...
 - .NET基础拾遗(5)多线程开发基础
		
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
 - C#多线程之基础篇3
		
在上一篇C#多线程之基础篇2中,我们主要讲述了确定线程的状态.线程优先级.前台线程和后台线程以及向线程传递参数的知识,在这一篇中我们将讲述如何使用C#的lock关键字锁定线程.使用Monitor锁定线 ...
 - C#多线程之基础篇2
		
在上一篇C#多线程之基础篇1中,我们主要讲述了如何创建线程.中止线程.线程等待以及终止线程的相关知识,在本篇中我们继续讲述有关线程的一些知识. 五.确定线程的状态 在这一节中,我们将讲述如何查看一个线 ...
 - C#多线程之基础篇1
		
在多线程这一系列文章中,我们将讲述C#语言中多线程的相关知识,在多线程(基础篇)中我们将学习以下知识点: 创建线程 中止线程 线程等待 终止线程 确定线程的状态 线程优先级 前台线程和后台线程 向线程 ...
 - Java多线程系列--“基础篇”11之 生产消费者问题
		
概要 本章,会对“生产/消费者问题”进行讨论.涉及到的内容包括:1. 生产/消费者模型2. 生产/消费者实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p ...
 - Java多线程系列--“基础篇”04之 synchronized关键字
		
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
 - Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式
		
概要 本章,我们学习“常用的实现多线程的2种方式”:Thread 和 Runnable.之所以说是常用的,是因为通过还可以通过java.util.concurrent包中的线程池来实现多线程.关于线程 ...
 
随机推荐
- java 解析json字符串
			
如果转载我的这篇文章请注明出处,谢谢! 最近工作中,需要解析json格式的字符串,恰好有个例子,感觉不错,拿来分享. 运行这个类需要加载jar包:ezmorph-1.0.6.jar.json-lib- ...
 - Java并发编程--1.Thread和Runnable
			
创建线程 Java有两种方式创建线程, 继承Thread类和实现Runnable接口 继承Thread 步骤: 1.自定义一个类继承Thread类, 重写run方法 2.创建自定义类的对象,调用sta ...
 - boost的初步了解
			
本章介绍了 Boost C++ 库 Asio,它是异步输入输出的核心. 名字本身就说明了一切:Asio 意即异步输入/输出. 该库可以让 C++ 异步地处理数据,且平台独立. 异步数据处理就是指,任务 ...
 - JFinal 部署在 Tomcat 下推荐方法(转载)
			
经常有人在群里问 tomcat 下项目部署的问题,现写个简单的博文,希望能帮助到有需要的人. 首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目 ...
 - 【LeetCode2】Add Two Numbers★★
			
题目描述: 解题思路: 给定两个链表(代表两个非负数),数字的各位以倒序存储,将两个代表数字的链表想加获得一个新的链表(代表两数之和). 如(2->4->3)(342) + (5-> ...
 - ORA-28000 账号被锁定的解决办法
			
ORA-28000 账号被锁定的解决办法 错误场景:当使用sqlplus进行登录时报错:ORA-28000 账号被锁定.错误原因:由于oracle 11g 在默认在default概要文件中设置了密码最 ...
 - Java开发工程师基础Math,Random,Scanner类的使用
			
Math类的使用(重点) (1)数学操作类:该类没有构造函数,方法均为静态的 (2)掌握内容 A:成员变量 **E:比任何其他值都更接近e(即自然对数的底数)的double值. **PI:比任何其他值 ...
 - 如何方便的结果ajax使用html5的新type类型
			
今天需要做手机端的输入表单自动生成器,突然就想到了手机端对input的输入类型支持还不错,于是翻遍了资料,有了下面的使用方法,闲话少说,上正文: html5现在可以用的新input type类型一共有 ...
 - [外观] Firemonkey Windows Hint 气球样式
			
Firemonkey 在 Windows 平台下的 Hint 默认为距形,有些单调,现在只要加入一行代码,就可以有气球箭头样式的 Hint. 修改代码: 请将 FMX.Controls.Win.pas ...
 - 关于IRAM和IFLASH启动模式,重映射remap 整理中
			
工程基于NXP LPC2468 1 为什么试用IRAM MODE 2 设置Program algorithm 编程算法的作用是什么 3 IRAM和FLASH 模式下IROM和IRAM的地址为什么不一样 ...