C# Thread线程学习笔记

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:强制结束线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值