執行緒的理解及運用
- 一、行程、執行緒和協程的理解
- 1、行程、執行緒、協程的區別和定義
- 2、串行,并行和并發的基本概念
- 二、執行緒的使用
- 三、行程(Process)的使用
一、行程、執行緒和協程的理解
在unity中可以使用多執行緒去做 解壓資源、更新資源等操作,因為單開執行緒的話 不會影響主執行緒卡頓,這樣UI就不會卡了,但是開的執行緒里邊不能執行unity主執行緒的mono代碼,執行緒啟動后,執行完畢自動結束該執行緒、可以同時啟動多個執行緒做事,
比如微信,在啟動的時候就會開兩個執行緒,微信有兩個行程分別是com.tencent.mm(A), com.tencent.mm:push(B),這里可以把A行程當成是主要處理UI變化的行程,B行程是處理訊息同步的行程,在把A行程關掉之后,如果沒有訊息觸發,B行程是不會喚醒A行程,而當B行程被干掉后,微信的做法是A行程也同時被干掉了,個人猜測微信的做法可能是基于這種情況,如果只有A行程,那是收不到訊息的,因為訊息處理都是在B行程進行的,這就會出現很多bug,
實時通訊軟體需要有一個后臺服務常駐,但是通常情況下單一行程容易被干掉,雙行程的好處一個是可以實作相互喚起,另一個好處單獨行程去處理訊息更不容易出現訊息的阻塞現象,這點對實時通訊軟體還是比較關鍵的,
1、行程、執行緒、協程的區別和定義
行程(Process)是一個物體,是計算機中的程式關于某資料集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是作業系統結構的基礎,在早期面向行程設計的計算機結構中,行程是程式的基本執行物體;在當代面向執行緒設計的計算機結構中,行程是執行緒的容器,程式是指令、資料及其組織形式的描述,行程是程式的物體,
執行緒(Thread)是行程中的實際運作單位,行程的基本單元;一個行程可以包含若干個執行緒,某個程式開始時執行時,行程的第一個執行緒被默認為該行程的主執行緒,
協程(IEnumerator)是一個執行緒執行,兩個子程序通過相互協作完成某個任務,協程和子程式呼叫很像,但協程是在子程式內部中斷去執行別的子程式,適當時候回傳接著執行,中斷有別于函式呼叫,
執行緒之間的聯系:
一個行程中可以創建多個執行緒,多執行緒之間是迸發執行的,一個執行緒可以終止其他執行緒或者開啟其他執行緒,但是每個執行緒之間就算是共享了資料,他們也都擁有自己獨立的堆疊空間和執行順序,
多執行緒的優點:
每個執行緒都有獨立的堆疊空間,多執行緒可可同時執行多個功能,提高行程的運行效率,目前電腦都是多核多CPU的,一個CPU在同一時刻只能運行一個執行緒,但是多個CPU在同一時刻就可以運行多個執行緒,
多執行緒的缺點:
執行緒太多了不好對其管理控制,容易讓程式崩潰,雖然多執行緒提高了運行效率,但是同時也提高了占用記憶體的空間,
2、串行,并行和并發的基本概念

二、執行緒的使用
參考:System.Threading
執行緒類:Thread
創建一個新執行緒:
Thread newThread=new Thread(new ThreadStart());*
注:ThreadStart是一個委托,可傳入該執行緒的執行事件
thread.Start(): 讓一個執行緒開始執行
thread.Abort(): 終止執行緒的運行
Thread.Sleep(float timer): 使執行緒掛起一段時間,timer=1000就相當于該執行緒在此處暫停1s后再繼續執行
using UnityEngine;
using System.Threading;
public class ThreadTest:MonoBehaviour
{
void StartThread()
{
Thread athread = new Thread(new ThreadStart(goThread));
athread.IsBackground = true;//控制該執行緒隨主執行緒的退出而退出,防止出現后臺執行緒,相反需要后臺執行緒就設為false
athread.Start();
}
void Awake()
{
Debug.Log("系統內核數:"+SystemInfo.processorCount);
StartThread();
}
object lockd = new object();
void goThread()
{
int index = 0;
while (true)
{
//防止其他執行緒訪問當前執行緒使用的資料
//lockd 不能是值型別,也不能是string
lock (lockd)
{
Debug.Log("in thread" + index);
index++;
if (index == 10)
{
Thread.Sleep(5000);// 將當前執行緒掛起指定的時間 毫秒 時間結束后 繼續執行下一步 和yield類似
}
else if (index == 20)
{
break;//該函式執行完自動結束該執行緒
}
}
}
}
}
1、當在主執行緒中創建了一個執行緒,那么該執行緒的IsBackground默認是設定為FALSE的,
2、當主執行緒退出的時候,IsBackground=FALSE的執行緒還會繼續執行下去,直到執行緒執行結束,
3、只有IsBackground=TRUE的執行緒才會隨著主執行緒的退出而退出
注:關于lock關鍵字,可參考這篇博客:https://www.cnblogs.com/jintianhu/archive/2010/11/19/1881494.html
再來個雙執行緒案例:
Thread thread_Print;//這是負責列印文字的執行緒
Thread thread_Abort;//這是一個終止執行緒
private void Start()
{
EnableThread();
}
//開啟執行緒
void EnableThread()
{
//首先要創建一個執行緒,執行文字的列印
thread_Print = new Thread(new ThreadStart(PrintWord));
//然后呼叫Start函式啟動該執行緒
thread_Print.Start();
//我們再來創建一個終止執行緒,在30s之后,停止列印文字的執行緒
thread_Abort = new Thread(new ThreadStart(() =>
{
Thread.Sleep(30000);
print("停止執行緒的執行!");
//文字列印的執行緒執行停止
AbortThread();
}));
//別忘了啟動終止執行緒
thread_Abort.Start();
}
/// <summary>
/// 每隔5秒回圈列印文字
/// </summary>
void PrintWord()
{
while (true)
{
print("Good Boy!");
Thread.Sleep(5000);
}
}
/// <summary>
/// 終止執行緒的執行
/// </summary>
void AbortThread()
{
//終止文字列印執行緒的執行
if (thread_Print != null)
{
thread_Print.Abort();
}
//終止 控制停止的執行緒
if (thread_Abort != null)
{
thread_Abort = null;
}
}
運行后的結果如下圖:

三、行程(Process)的使用
Process類
負責啟動和停止本機行程,獲取或設定行程優先級,確定行程是否回應,是否已經退出,以及獲取系統正在運行的所有進行串列和各行程資源占用情況,也可以查詢遠城計算機上行程相關資訊,包括行程內的執行緒集合、加載模塊(.dll檔案和.exe檔案)和性能資訊(如當前行程使用的記憶體量)
具體可參考此博客:C#的 Process類
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/310665.html
標籤:其他
上一篇:GPS定位解決偏差
