1.1线程基础(一)
来源:互联网 发布:科来抓包软件破解版 编辑:程序博客网 时间:2024/06/03 21:32
准备工作
创建一个控制台程序
并在Program.cs文件中加入以下using指令:
using System;using System.Threading;using System.Console;
1.1.1 创建线程
先定义一个方法
static void Test(){ Console.WriteLine("Starting..."); for (int i = 1; i < 100; i++) { Console.WriteLine(i); }}
Main方法中加入以下代码片段
Thread t = new Thread(Test);t.Start();
这样就完成了一个线程的创建.
1.1.2 暂停线程
只需要在线程调用的方法中调用Thread.Sleep方法就可以让线程暂停
static void Test(){ Console.WriteLine("Starting..."); for (int i = 1; i < 100; i++) { Console.WriteLine(i); Thread.Sleep(TimeSpan.FromSeconds(2)); //这样就让线程暂停了两秒钟 }}
1.1.3 等待线程
只需要在线程开始后调用t.Join方法就可以让主程序等待直到t线程完成
Thread t = new Thread(Test);t.Start();t.Join();//如果不想一直等待,也可以给它加参数//如: t.Join(TimeSpan.FromSeconds(2));等待两秒后主线程继续运行
1.1.4 终止线程
只需要在需要终止线程的地方调用t.Abort就可以了,但这非常危险,因为t.Abort方法是给t线程注入了ThreadAbortException方法,导致线程被终结的,该异常可以在任何时刻发生并可能彻底摧毁应用程序.另外,使用该方法也不一定总能终止线程.目标线程可以通过处理该异常并调用Thread.ResetAbort方法来拒绝终止.因此并不推荐使用Abort方法来关闭线程.可优先使用一些其他方法,比如提供一个CancellationToken方法来取消线程的执行.
Thread t = new Thread(Test);t.Start();Thread.Sleep(TimeSpan.FromSeconds(5));t.Abort(); //线程开始5秒后终止线程
1.1.5 检测线程状态
可以用t.ThreadState方法来获取线程当前的状态,如是否已经启动或是否处于阻塞等状态信息.由于线程是独立运行的,其状态可以在任何时候被改变,所以获取线程的当前状态是非常有用的.
Thread t = new Thread(Test);t.Start();Console.WriteLine(t.ThreadState);//打印t线程当前的状态
1.1.6 线程优先级
可以使用t.Priority来设置线程的优先级,线程优先级决定了该线程可占用多少CPU时间.
Thread t = new Thread(Test);t.Priority = ThreadPriority.Highest;t.Start();
1.1.7 前台线程和后台线程
用t.IsBackground设置线程为前台线程和后台线程.
1.前台线程和后台线程的主要区别:进程会等待所有的前台线程完成后再结束工作,但如果只剩下后台线程,则会直接结束工作.
2.注意事项:如果程序定义了一个不会完成的前台线程,主程序并不会正常结束.
Thread t = new Thread(Test);t.IsBackground = true;t.Start();
1.1.8 向线程传递参数
使用t.Start传递数据,为了应用该方法,在线程中启动的方法必须接受object类型的单个参数.
static void Test(object obj){ int count = (int) arg; Console.WriteLine("Starting..."); for (int i = 1; i < count; i++) { Console.WriteLine(i); Thread.Sleep(TimeSpan.FromSeconds(2)); }}Thread t = new Thread(Test);t.Start(8);
使用lambda表达式传递参数.
static void Test(int i){ Console.WriteLine(i);}Thread t = new Thread(()=> Test(1));t.Start();
这可能会导致几个问题.例如在多个lambda表达式中使用相同的变量,他们会共享该变量值.例如下面这个例子,t1和t2都会打印出20,因为在这两个线程启动之前变量被修改为20.
int i = 10;Thread t1 = new Thread(()=> Test(i));i = 20;Thread t2 = new Thread(()=> Test(i));t1.Start();t2.Start();
- 1.1线程基础(一)
- 线程学习一:线程基础
- 线程控制(一)线程基础
- 线程基础 一
- JAVA线程基础(一)
- 线程基础(一)
- java基础---线程一
- Java线程基础一
- 线程系列(一)--基础
- 线程基础介绍一
- 线程基础(一)
- 线程基础(一)
- 并发线程基础(一)
- 线程同步基础(一)
- 线程基础(一)
- java线程编程(一):线程基础
- 线程(一)线程基础(1)
- 关于线程(一)线程的基础
- Android右布局属性
- [RK3288][Android6.0] WiFi之Framework扫描过程
- 华为OJ——字符串合并处理
- Android 中Button点击频率的控制
- 二分查找
- 1.1线程基础(一)
- ubuntu14.04网络图标消失不见
- boost--windows平台下针对VS的简单编译
- 新版本Django在Windows和Linux下的部署
- 符号链接文件和硬链接文件
- CListBox创建控件大小自动变化
- 在某个SQL Server中开启CDC功能
- linux怎么上网?
- java动态代理原理及解析