小鸟游星野
小鸟游星野
Published on 2025-05-13 / 5 Visits
0
0

Unity C#线程池

using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;

public class Lesson4 : MonoBehaviour
{
    Thread t;
    // Start is called before the first frame update
    void Start()
    {
        #region 知识点一 C#5.0新特性和语法改进
        //1.调用方法信息(C#反射相关特性)
        //2.异步编程 async和await

        //在学习异步编程async和await之前
        //我们必须补充一些知识:
        //1.线程和线程池
        //2.Task任务
        //本节课将回顾和学习线程和线程池
        #endregion

        #region 知识点二 回顾知识点——线程
        //1.Unity支持多线程
        //2.Unity中的多线程不能操作主线程中的对象
        //3.Unity中的线程需要自己手动关闭
        //t = new Thread(()=> {
        //    while (true)
        //    {
        //        print("123");
        //        Thread.Sleep(1000);
        //    }
        //});
        //t.Start();
        //print("主线程执行");
        #endregion

        #region 知识点三 新知识点——线程池
        //命名空间:System.Threading
        //核心类:ThreadPool(线程池)

        //在多线程的应用开发中,频繁的创建销毁线程会导致性能开销和内存碎片
        //为了避免这种情况,C#推出了线程池ThreadPool

        //ThreadPool会预先创建若干线程,当需要执行任务时从线程池中获取空闲线程来执行
        //任务执行完毕后线程不会销毁,而是被线程池回收以供复用
        //当线程池中的所有线程都忙碌时,新请求的任务会进入队列等待
        //线程池能减少线程的创建次数,节省资源开销并减少GC压力

        //线程池相当于有一个专门装线程的"池子"(Unity小黄鸭老师有对对象池的详细讲解)
        //优点:节省资源,减少线程创建次数,提高效率,减少GC
        //缺点:不能控制线程池中线程的执行顺序,也不能获取线程的取消/异常/完成通知

        //ThreadPool是静态类
        //主要提供以下常用方法:

        //1.获取可用工作线程数和I/O线程数
        int num1;
        int num2;
        ThreadPool.GetAvailableThreads(out num1, out num2);
        print(num1);
        print(num2);
        
        //3.设置线程池中允许同时处于活动状态的最大工作线程数和I/O线程数
        //  超过数量的请求将排队等待,直到有线程可用
        //  修改成功返回true,失败返回false
        if(ThreadPool.SetMaxThreads(20, 20))
        {
            print("设置成功");
        }

        //2.获取线程池的最大工作线程数和I/O线程数
        ThreadPool.GetMaxThreads(out num1, out num2);
        print(num1);
        print(num2);

        //5.设置线程池的最小工作线程数和I/O线程数
        if(ThreadPool.SetMinThreads(5, 5))
        {
            print("设置成功");
        }
        //4.获取线程池的最小工作线程数和I/O线程数
        ThreadPool.GetMinThreads(out num1, out num2);
        print(num1);
        print(num2);

        //6.将任务加入队列,由线程池中的线程在可用时执行
        //ThreadPool.QueueUserWorkItem((obj) =>
        //{
        //    print(obj);
        //    print("这是一个线程池线程");
        //}, "测试参数");

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

        print("主线程执行");
        #endregion

        #region 总结
        //线程池是一个C#内置的线程容器
        
        //优点:不需要频繁创建/销毁线程,节省内存
        //缺点:不能控制线程的执行顺序,也不能获取线程状态通知
        #endregion
    }

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

    void Update()
    {
        
    }
}


Comment