自学内容网 自学内容网

C#线程池

目录

前言

线程

线程池

线程池的工作原理

重要方法

C#线程池总结


前言

        线程池是一种多线程处理形式,它允许开发者将任务添加到队列中,然后线程池会自动管理线程的创建、分配和回收,以执行这些任务。线程池中的线程都是后台线程,它们使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。

线程

1.Unity支持多线程
2.Unity中开启的多线程不能使用主线程中的对象
3.Unity中开启多线程后一定记住关闭

using System.Threading;
using UnityEngine;

public class Test : MonoBehaviour
{
    Thread t;
    void Start()
    {
        t = new Thread(() =>
        {
            while (true)
            {
                print("123");
                Thread.Sleep(1000);
            }
        });
        t.Start();
        print("主线程执行");
    }

    private void OnDestroy()
    {
        t.Abort();
    }
}

线程池

命名空间:System.Threading
类名:ThreadPool(线程池)

在多线程的应用程序开发中,频繁的创建删除线程会带来性能消耗,产生内存垃圾
为了避免这种开销C#推出了 线程池ThreadPool类

ThreadPool中有若干数量的线程,如果有任务需要处理时,会从线程池中获取一个空闲的线程来执行任务
任务执行完毕后线程不会销毁,而是被线程池回收以供后续任务使用
当线程池中所有的线程都在忙碌时,又有新任务要处理时,线程池才会新建一个线程来处理该任务,
如果线程数量达到设置的最大值,任务会排队,等待其他任务释放线程后再执行
线程池能减少线程的创建,节省开销,可以减少GC垃圾回收的触发

线程池相当于就是一个专门装线程的缓存池

线程池的工作原理

线程池的创建和管理:在应用程序启动时,CLR(公共语言运行时)会创建一个线程池,并初始化一定数量的线程。这些线程被放入线程池队列中,等待任务的到来。

任务提交:当应用程序需要执行一个新的任务时,它会将任务提交给线程池。线程池会将任务添加到线程池队列中,等待空闲的线程来执行。

任务执行:空闲的线程会从线程池队列中取出任务并执行。任务执行完成后,线程会返回到线程池中,以便执行下一个任务。

线程的动态调整:线程池会根据任务的执行情况和系统的资源状况,动态地增加或减少线程的数量。例如,当任务队列中的任务较多时,线程池会创建更多的线程来执行任务;而当任务较少时,线程池会减少线程的数量以节省资源。

优点:节省开销,减少线程的创建,进而有效减少GC触发
缺点:不能控制线程池中线程的执行顺序,也不能获取线程池内线程取消/异常/完成的通知

重要方法

ThreadPool是一个静态类
里面提供了很多静态成员
其中相对重要的方法有

1.获取可用的工作线程数和I/O线程数

int num1;
int num2;
ThreadPool.GetAvailableThreads(out num1, out num2);
print(num1);
print(num2);

2.获取线程池中工作线程的最大数目和I/O线程的最大数目

ThreadPool.GetMaxThreads(out num1, out num2);
print(num1);
print(num2);

3.设置线程池中可以同时处于活动状态的 工作线程的最大数目和I/O线程的最大数目
大于次数的请求将保持排队状态,知直到线程池线程变为可用
更改成功返回true,失败返回false

if(ThreadPool.SetMaxThreads(20, 20))
{
    print("更改成功");
}

4.获取线程池中工作线程的最小数目和I/O线程的最小数目

ThreadPool.GetMinThreads(out num1, out num2);
print(num1);
print(num2);

5.设置 工作线程的最小数目和I/O线程的最小数目

if(ThreadPool.SetMinThreads(5, 5))
{
    print("设置成功");
}

6.将方法排入队列以便执行,当线程池中线程变得可用时执行

ThreadPool.QueueUserWorkItem((obj) =>
{
    print(obj);
    print("开启了一个线程");
}, "123452435345");

for (int i = 0; i < 10; i++)
{
    ThreadPool.QueueUserWorkItem((obj) =>
    {
        print("第" + obj + "个任务");
    }, i);
}

print("主线程执行");

C#线程池总结

C#线程池是一种强大的并发编程工具,它允许开发者在不需要手动管理线程生命周期的情况下,高效地执行并发任务。以下是对C#线程池的总结

基本概念
线程池是一种线程复用技术,它维护了一组可用线程,以便在需要时快速响应并执行任务。
在C#中,线程池由CLR(公共语言运行时)管理,并提供了简单的API来提交任务。

工作原理
当任务被提交到线程池时,它会被放入一个内部队列中。
线程池中的空闲线程会从队列中取出任务并执行。
如果所有线程都在忙,新任务将等待直到有线程可用。
线程池会根据需要动态调整线程的数量,以优化性能和资源利用率。

优势
性能提升:通过重用线程,减少了线程的创建和销毁开销,提高了系统的响应速度和吞吐量。
资源高效利用:线程池能够更有效地利用系统资源,避免了因过多线程竞争资源而导致的性能下降。
简化编程:开发者无需手动管理线程的创建、分配和回收,只需将任务提交给线程池即可,从而简化了并发编程的复杂性。

使用方法:使用ThreadPool.QueueUserWorkItem方法将任务添加到线程池队列中。
可以使用ThreadPool.SetMaxThreadsThreadPool.SetMinThreads方法来设置线程池中的最大和最小线程数(但通常不建议手动设置这些值,因为线程池会根据需要自动调整)。

注意事项:避免在线程池线程中执行长时间运行或阻塞操作,因为这会影响线程池的效率和性能。需要注意异常处理和错误处理机制,以确保任务的正确执行和系统的稳定性。
对于需要长时间运行的任务,考虑使用其他并发模型(如Task并行库或异步编程模型)来替代线程池。


原文地址:https://blog.csdn.net/weixin_67674686/article/details/143590936

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!