C# Thread线程学习笔记
一、线程的定义
在了解线程之前,我们需要先了解什么是进程,以及进程和线程之间的关系。
进程
1、进程(process):是一块包含了某些资源的内存区域,操作系统利用进程把它的工作划分为一些功能单元。(在我们启动一个应用程序后,系统会给他分配一定的内存以及其他的一些资源,这些划分的内存和资源的物理分隔就是进程)
2、按下Ctrl+Shift+Esc,打开任务管理器,在任务管理器中可以看到进程、性能、应用历史记录、启动、用户、详细信息和服务。在进程中你可以看到当前正在运行的进程名称,以及其CPU情况,内存以及其他等状况,如果信息不够可以右击选出需要查看的信息。
“应用程序”和“进程”分属于两个不同的选项卡=>两者不可混为一谈(一个应用可以包含一个或多个进程),每个进程都有自己独立的数据、执行代码以及系统数据。
eg:打开任务管理器,双击打开Microsoft Edge,会发现应用程序默认创建两个进程,如果打开更多的选项卡将会创建更多的进程。
线程
1、线程:系统分配处理器时间资源的基本单元(最小单元)。进程之内的独立执行的一个单元。
2、属性
(1)线程是单独运行的单元;
(2)一个进程内部有多个线程;
(3)每个线程都有可各自同时执行指令;
(4)有独立的栈;
(5)与进程内其他的线程共享内存;
(6)对于客户端而言,有CLR创建的单线程(主线程,只创建一个线程)来启动,再在该线程的基础上创建其他的线程。
(7)单线程应用,在进程的独立环境中只跑一个线程,该线程拥有独占权
(8)多线程应用,单个进程中会跑多个线程,它们会共享当前执行环境(尤其是内存)。
二、创建Thread的四种方法
using System;
using System.Threading;
using System.Windows.Forms;
namespace 线程
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;//必不可少
}
/// <summary>
/// 通过无参【静态】方法创建线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void start_Click(object sender, EventArgs e)
{
Thread thread1 = new Thread(new ThreadStart(method));
thread1.Start();
}
public void method()
{
this.textBox1.Text += Thread.CurrentThread.ManagedThreadId + "通过无参【静态】方法创建线程\r\n";
}
/// <summary>
/// 通过匿名委托创建线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void start1_Click(object sender, EventArgs e)
{
Thread thread2 = new Thread(delegate () { this.textBox1.Text += Thread.CurrentThread.ManagedThreadId + "通过匿名委托创建线程\r\n"; });
thread2.Start();
}
/// <summary>
/// 通过lambda表达式创建线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void start2_Click(object sender, EventArgs e)
{
Thread thread3 = new Thread(() => textBox1.Text += Thread.CurrentThread.ManagedThreadId + "通过lambda表达式创建线程\r\n");
thread3.Start();
}
/// <summary>
/// 通过有参委托创建线程
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void start3_Click(object sender, EventArgs e)
{
Thread thread4 = new Thread(new ParameterizedThreadStart(method2));
thread4.Start("通过有参委托创建线程");
}
public void method2(object obj)
{
string s = Thread.CurrentThread.ManagedThreadId + (string)obj;
textBox1.Text += s + "\r\n";
}
}
}
三、Thread常用的方法
1、Start:开始执行线程。
thread1.Start();
2、Abort:终止线程
Thread.Abort();
3、Join:阻塞调用线程,直到某个线程终止或过来指定的时间。
4、Sleep:将当前线程挂起/阻塞指定时间(若Sleep时用interrupt,会抛出异常)。
5、SpinWait:导致线程等待由iterations参数定义的时间量。
6、Yield:暂停当前线程,并执行其他线程。
7、Run:不是run方法实现线程逻辑,而是Thread.run(),这个run方法是直接调动线程中的run。
8、interrupt:中断线程。
9、wait/notify:从Object类继承下来的方法。
10、setPriority:设置线程优先级(只能在线程开始前设置)。
11、Stop:强制结束线程。