執行緒同步 等待所有執行緒執行完畢

2022-01-16 00:56:18 字數 3112 閱讀 1433

在多執行緒程式中經常會碰到執行緒同步:

場景1主線程啟動多個子執行緒後,主線程需要等待所有的子執行緒執行完畢後,主線程才能進一步向下執行。

c# 提供了 manualresetevent 類為我們的執行緒同步提供了方便.

manualresetevent.waitall(new waithandle );

waitall靜態方法提供了阻塞當前執行緒的執行,直到waithandle中的每個執行緒傳送了阻塞解除的訊號,當前執行緒才會繼續執行。

可以通過將布林值傳遞給建構函式來控制 manualresetevent 的初始狀態,如果初始狀態處於終止狀態,為 true;否則為 false。

manualresetevent.set() 方法傳送阻塞終止的訊號,當其它執行緒收到執行緒阻塞解除的訊號,就會繼續執行。

場景:主線程需要對子執行緒1產生的資料與子執行緒2產生的資料求和,主線程啟動執行緒1等待生成資料1,啟動執行緒2等待生成資料2,只有當

資料1與資料2生成後,主線程才能對資料求和。

**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

using

system.diagnostics;

namespace

threadstudy.hbb0b0

current number: block stop

", thread.currentthread.managedthreadid, result1);

//輔助線程阻塞完畢

m1.set();

};asynccallback g2_callback = delegate

(iasyncresult ar)

current number: block stop

", thread.currentthread.managedthreadid, result2);

//輔助線程阻塞完畢

m2.set();

};console.writeline(

"generate numbers:");

//輔助線程1啟動

g1.begininvoke(

10, g1_callback, null

);

//輔助線程2啟動

g2.begininvoke(

100, g2_callback, null);

//主線執行緒等待所有輔助線程回歸

manualresetevent.waitall(

newwaithandle );

int sum=threadtool.sum(result1, result2);

console.writeline("+=

", result1, result2, sum);

console.read();}}

public

class

threadtool

generate number

", thread.currentthread.managedthreadid);

thread.sleep(

5000

);

int result = new random((int

)datetime.now.ticks).next(maxnum);

return

result;

}//////

累加結果

/// ///

//////

static

public

int sum(int a, int

b) gernerate number

", thread.currentthread.managedthreadid);

thread.sleep(

6000

);

return a +b;}}

}

場景2 :

主線程啟動子執行緒1,子執行緒2, 只要子執行緒1或子執行緒2 任一線程執行完畢,主線程就可以繼續執行。

**如下:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading;

namespace

threadwaitone

}public

class

threadtool

);console.writeline(

"main thread: the fast thread:

", currentthreadid);}}

public

void generatenumber(object

resetevent)

wait: generate number start:.....

", thread.currentthread.managedthreadid,threadinfo.m_waitticks);

thread.sleep(threadinfo.m_waitticks);

int radomnumber = new random((int)datetime.now.ticks).next(1000

);

lock

(m_syncobject)

console.writeline(

"thread id: generate number:

", thread.currentthread.managedthreadid, radomnumber);

threadinfo.m_mr.set();}}

}

易語言 多執行緒,等待所有執行緒執行完畢後操作

用處 當你請求網路,想吧網路請求的結果放到乙個全域性陣列中,然後最後一塊處理陣列 執行緒呼叫案列 版本 2 支援庫 ethread 支援庫 spec 程式集 視窗程式集1 子程式 按鈕1 被單擊 區域性變數 handle,整數型 啟動執行緒 thread,handle 關閉執行緒控制代碼 handl...

Java主線程等待所有子執行緒執行完畢

需求 main方法中建立了執行緒,子執行緒沒有執行結束的時候主線程執行結束了,利用join又不能保證併發執行,目的是主線程等待其子執行緒執行完成之後退出 實現 利用hook實現jvm的等待執行 業務執行緒 class customerthread implements runnable catch ...

c 等待所有子執行緒執行完畢方法

當我們在使用執行緒中,你會發現主線結束後子執行緒的結果才顯示出來。現在我要等待所以子執行緒結束,然後在顯示結果,怎麼做呢?方法如下 1 使用 manualresetevent,如下 using system.threading namespace threadstudy waithandle.wai...