Unity C# 基础复习32——线程(P475)

本文介绍了Unity中线程的创建与管理,包括如何创建后台线程,线程的几种状态转换,以及线程池的使用。同时,讲解了Task类在异步编程中的应用,如何等待任务完成以及获取返回值,展示了泛型Task在计算结果中的应用。

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

一、创建线程和后台线程

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值