在多執行緒程式中經常會碰到執行緒同步:
場景1主線程啟動多個子執行緒後,主線程需要等待所有的子執行緒執行完畢後,主線程才能進一步向下執行。
c# 提供了 manualresetevent 類為我們的執行緒同步提供了方便.
manualresetevent.waitall(new waithandle );
waitall靜態方法提供了阻塞當前執行緒的執行,直到waithandle中的每個執行緒傳送了阻塞解除的訊號,當前執行緒才會繼續執行。
可以通過將布林值傳遞給建構函式來控制 manualresetevent 的初始狀態,如果初始狀態處於終止狀態,為 true;否則為 false。
manualresetevent.set() 方法傳送阻塞終止的訊號,當其它執行緒收到執行緒阻塞解除的訊號,就會繼續執行。
場景:主線程需要對子執行緒1產生的資料與子執行緒2產生的資料求和,主線程啟動執行緒1等待生成資料1,啟動執行緒2等待生成資料2,只有當
資料1與資料2生成後,主線程才能對資料求和。
**如下:
usingsystem;
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 任一線程執行完畢,主線程就可以繼續執行。
**如下:
usingsystem;
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...