(二)前台线程和后台线程

博客围绕前台线程和后台线程展开,介绍了其概念、线程优先级。还阐述了控制线程的方法,如获取线程状态、终止线程。提及线程池发起线程,其执行的是后台线程且适用于短任务,以及通过任务开启线程的层次结构。最后探讨了线程争用和死锁问题及解决办法。

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

前台线程和后台线程

概念

在这里插入图片描述

线程的优先级

控制线程

在这里插入图片描述
1.获取线程状态
2.终止线程

线程池发起线程

在这里插入图片描述
线程池执行的都是后台线程
线程池只能用于时间比较短的任务

namespace ConsoleApp1
{
    class Program
    {
        static void ThreadMethod(object state)
        {
            Console.WriteLine("线程开始"+Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            Console.WriteLine("线程结束");
        }
        static void Main(string[] args)
        {
            //线程池创建后台线程
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            ThreadPool.QueueUserWorkItem(ThreadMethod);
            Console.ReadKey();

        }
    }
}

通过任务开启线程

namespace ConsoleApp1
{
    class Program
    {
        static void ThreadMethod()
        {
            Console.WriteLine("任务开始"+Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(2000);
            Console.WriteLine("任务结束");


        }
        static void Main(string[] args)
        {   //1.Task开启任务
            //传递一个需要线程去执行的方法
            //  Task task = new Task(ThreadMethod);
            //task.Start();

            //2.TaskFactory创建
            //TaskFactory tf=new TaskFactory();
            //Task t=tf.StartNew(ThreadMehtod);
            Console.WriteLine("main");
            Console.ReadKey();

        }

    

    }
}

任务的层次结构
父任务等待子任务执行完成才完成

线程争用和死锁

模拟线程争用

using System.Threading;
using System.Threading.Tasks;

//模拟线程争用
namespace ConsoleApp1
{
    class Program
    {
        //模拟线程争用
        static void ChangStateMain(object o)
        {
            MyThreadObject m = o as MyThreadObject;
            while(true)
            {
                m.ChangState();
            }
        }
        static void Main(string[] args)
        {
            MyThreadObject m = new MyThreadObject();
            new Thread(ChangStateMain).Start(m);
            new Thread(ChangStateMain).Start(m);

            Console.WriteLine("main");
            Console.ReadKey();
        }
    }
}

MyThreadObject

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class MyThreadObject
    {
        private int state = 5;
        public void ChangState()
        {
            state++;
            if(state==5)
            {
                Console.WriteLine("state=5");
            }
            state = 5;
        }
    }
}

加锁

using System.Threading;
using System.Threading.Tasks;

//模拟线程争用
namespace ConsoleApp1
{
    class Program
    {
        //模拟线程争用
        static void ChangStateMain(object o)
        {
            MyThreadObject m = o as MyThreadObject;
            while(true)
            {
                //向系统申请可不可以锁定m对象,如果m对象没有被锁定,那么可以
                //如果m对象已经被锁定,则该语句会暂停
                //同一时刻只有一个线程在执行该发方法
                lock(m)
                {
                    m.ChangState();
                }//释放对m的锁定             
            }
        }
        static void Main(string[] args)
        {
            MyThreadObject m = new MyThreadObject();
            new Thread(ChangStateMain).Start(m);
            new Thread(ChangStateMain).Start(m);

            Console.WriteLine("main");
            Console.ReadKey();
        }
    }
}

死锁
编程开始之前设定好锁定的顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值