一、创建线程和后台线程
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Threading;
public class Test : MonoBehaviour
{
private void Start()
{
Thread t = new Thread(Run);
t.Start();
Debug.Log(t.IsBackground);//判断是否后台线程
Thread t2 = new Thread(Run2);
t2.Start();
Debug.Log(t.IsBackground);//判断是否后台线程
//Thread t = new Thread(new ThreadStart(Run)); //通过委托的形式创建线程
//t.Start();
}
static void Run()
{
while (true)
{
Debug.Log("aaa");
Thread.Sleep(1000);
}
}
static void Run2()
{
while (true)
{
Debug.Log("bbb");
Thread.Sleep(1000);
}
}
}
二、线程的几种状态
public class Test : MonoBehaviour
{
private void Start()
{
//线程的几种状态
Thread t = new Thread(new ThreadStart(Run)); //通过委托的形式创建线程
Debug.Log("Start前" + t.ThreadState);
t.Start();
Debug.Log("Start后" + t.ThreadState);
t.Suspend(); //挂起
Debug.Log("Suspend后" + t.ThreadState);
t.Resume(); //启动
Debug.Log("Resume后" + t.ThreadState);
t.Abort(); //中止
Debug.Log("Abort后" + t.ThreadState);
}
static void Run()
{
while (true)
{
Debug.Log(DateTime.Now + " " + DateTime.Now.Millisecond);
Thread.Sleep(1000);
}
}
}
三、线程池
由于线程的创建和销毁需要耗费一定的开销,过多的使用线程会造成内存资源的浪
费,出于对性能的考虑,于是引入了线程池的概念。线程池维护一个请求队列,线程池
的代码从队列提取任务,然后委派给线程池的一个线程执行,线程执行完不会被立即销
毁,这样既可以在后台执行任务,又可以减少线程创建和销毁所带来的开销。
线程池默认为后台线程
ThreadPool.QueueUserWorkItem(Run,"AAA");
四、任务
使用ThreadPoolf的QueueUserWorkItem()方法发起一次异步的线程执行很简单,但是
该方法最大的问题是没有一个内建的机制让你知道操作什么时候完成,有没有一个内建
的机制在操作完成后获得一个返回值。为此,可以使用System.Threading.Tasks中
的Task类。
注意执行次序
public class Test : MonoBehaviour
{
private void Start()
{
Task t1 = new Task(Sum);
t1.Start();
//t1.Wait(); //加上wait,先打印结果,后打印aaa。Wait()会让其他线程先等待
Debug.Log("aaa"); //先打印aaa(主线程),再打印结果(另外新开启的一个线程),新开启的线程需要计算时间
}
static void Sum()
{
int s = 0;
for (int i = 0; i < 100; i++)
{
s += i;
}
Debug.Log("结果是" + s);
}
}
5、用泛型Task来计算结果
public class Test : MonoBehaviour
{
private void Start()
{
//用泛型的Task来计算结果
Task<int> t1 = new Task<int>(Sum);
t1.Start();
Debug.Log(t1.Result); //返回结果
}
static int Sum()
{
int s = 0;
for (int i = 0; i < 100; i++)
{
s += i;
}
return s;
}
}