线程、多线程、防止线程重入

本文介绍了线程的概念,包括主线程与子线程的区分,前台线程与后台线程的区别。讨论了线程的创建方式,线程池的使用,并提到了线程安全问题,特别是线程重入及其防止方法——使用锁。最后,阐述了多线程的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个程序运行起来,都会生成一个进程。每个进程都有一个默认的进程。这个进程叫做主线程,也叫UI线程。

主线程之外,另外的线程都称为子线程。任何在程序里new的线程,都是子线程。

任何一个线程都会默认为前台线程。可以主动设置默认线程。//th.IsBackground = true;

后台线程与前台线程的区别:一个进程只有在所有的前台线程都结束,整个进程才会关闭。如果前台线程都结束了,假如后台线 程还在执行,那么所有的后台线程会被立刻结束。

创建一个线程,可以不带参数,也可以带参数。带参数时,是在.start()的括号里面调用的。

线程在用完了以后,不会立即消失,而是会存到线程池中。

 

ThreadPool线程池中有两个重载的静态方法可以直接启动工作者线程:

  •   ThreadPool.QueueUserWorkItem(waitCallback);
  •   ThreadPool.QueueUserWorkItem(waitCallback,Object);

  先把WaitCallback委托指向一个带有Object参数的无返回值方法,再使用ThreadPool.QueueUserWorkItem(WaitCallback)就可以一步启动此方法,此时异步方法的参数被视为null

能够暂时将跨线程问题跳过:

Control.CheckForIllegalCrossThreadCalls = false;

线程的常用成员:

1.Thread.CurrentThread;//获取当前的工作进程。

2.每个线程都有一个唯一的id,这个id是有操作系统维护的,id的作用就是为了操作系统来调度这些线程 

3.Thread.Sleep(3000);//暂停,让当前线程挂起,括号内的单位是毫秒,3000为3秒

4.Thread.Abort();//终止线程

线程重入:两个线程同时进行,一些共同的数据可能窜用。

防止线程重入:加锁。选中代码,然后右键,添加外侧代码,找到lock。

锁要生成为全局的,用this。lock(this),一般不会出错 

 

使用多线程:

using System.Threading;//引用进程

 
Thread th = new Thread(Loop);//创建一个子线程。//Thread()的括号内是一个委托
th.IsBackground = true;//主动设置默认线程
th.Start();//运行
  th.start(233)//带参数,传参
//将当前进程的id输出搭配textBox1中
this.textBox1.Text = Thread.CurrentThread.ManagedThreadId.ToString(); 
Thread.Sleep(3000);//暂停,暂时挂起,括号内的单位是毫秒,3000为3秒
  MessageBox.Show("三秒完了");//输出一个提示框
private void Loop()
        {
            for (int i = 0; i < 999999999; i++)
            {


            }
            MessageBox.Show("做完了");
        }

private static void GetNumber(object num)//带参数的委托
 {

 }
 private static void GetNumber2(object p)//带参数的委托,参数类型不为object的
 {
    Person p = p as person;
 }

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值