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()
{
}
}