直接**
static void main(string args)
1、初始的sendemailmethod方法
public static void sendemailmethod(int maxcount, int threadcount));}
//每組數量
int groupcount = datalist.count / threadcount;
//餘數
int leftcount = datalist.count % threadcount;
//分配給每個執行緒的郵件
var emailschemagroups = new list>();
for (int i = 0; i < threadcount; i++)
foreach (var emailschemagroup in emailschemagroups)
}) ;
thread.start(emailschemagroup);
//子執行緒新增join方法
thread.join();}}
執行結果如下圖所示:
主線程的輸出「終於輪到老子了」與子執行緒的輸出會隨機穿插出現。但是我需要讓主線程輸出在最後,這如何實現呢?這裡考慮到thread.join,會阻塞呼叫執行緒,直到子執行緒完成位置。那麼在每個子執行緒都呼叫join方法會如何?修改**如下:
public static void sendemailmethod(int maxcount, int threadcount));}
//每組數量
int groupcount = datalist.count / threadcount;
//餘數
int leftcount = datalist.count % threadcount;
//分配給每個執行緒的郵件
var emailschemagroups = new list>();
for (int i = 0; i < threadcount; i++)
foreach (var emailschemagroup in emailschemagroups)
}) ;
thread.start(emailschemagroup);
//子執行緒新增join方法
thread.join();}}
執行結果圖:
這裡每次執行主線程的輸出每次都會在子執行緒完成之後輸出,但是子執行緒呼叫join方法後,不僅僅阻止了主線程的呼叫,也阻止了其他子執行緒的呼叫,故此此處加了join方法之後是相當於單執行緒同步執行。此方法不可行,不能達到多執行緒的目的。
接下來我們再次修改**如下:
public static void sendemailmethod(int maxcount, int threadcount));}
//每組數量
int groupcount = datalist.count / threadcount;
//餘數
int leftcount = datalist.count % threadcount;
//分配給每個執行緒的郵件
var emailschemagroups = new list>();
for (int i = 0; i < threadcount; i++)
//新增執行緒集,用於監控執行緒狀態
var threads = new list();
foreach (var emailschemagroup in emailschemagroups)
}) ;
thread.start(emailschemagroup);
threads.add(thread);
}//建立監控執行緒
var monitor = new thread(threadmonitor) ;
monitor.start(threads);
monitor.join();//監控執行緒阻塞主線程
monitor.disablecomobjecteagercleanup();
}/// /// 執行緒監控
///
public static void threadmonitor(object obj)
thread.abort();
thread.disablecomobjecteagercleanup();}}
執行結果如下圖:
我們建立了乙個監控執行緒,用於監控子執行緒的狀態,通過判斷子執行緒的執行緒狀態(isalive)判斷子執行緒是否執行完成並殺死執行緒。監控執行緒使用join方法來阻塞主程序,這樣就得到想要的結果了。
這裡監控執行緒的作用:
1、阻塞主線程
2、確保子執行緒操作完成
續:上面的執行緒資源分配是平均分配的,比如說我有十個需要處理的資料,那麼會事先分成2組資料每組5個,分別交給2個執行緒。這樣做可以不用考慮資源會被重複訪問,但是會出現乙個執行緒先執行完,另乙個還有好幾個資料沒處理完,執行緒的利用率不是100%的。現在重新改良方法,如下:
public static void sendemailmethod(int maxcount, int threadcount));}
queuedataqueue = null;
if (datalist == null || datalist.count == 0)
dataqueue = new queue(datalist);
//執行緒呼叫
var threads = new list();
for (int i = 0; i < threadcount; i++)
}) ;
thread.start(dataqueue);
threads.add(thread);
}//執行緒監控
var monitor = new thread(threadmonitor) ;
monitor.start(threads);
monitor.join();
monitor.disablecomobjecteagercleanup();
}
這裡用到了泛型類queue<>解決資源分配不均勻問題。
C 執行緒 Threading 程式設計 例項
手頭乙個專案中,使用到多執行緒例,分配任務,處理任務,顯示任務狀態,等.by shelly using system using system.threading using system.collections namespace sharethread b thread.sleep 200 pu...
C 多執行緒程式設計簡單例項
using system using system.collections using system.collections.generic using system.threading 在開發中經常會遇到執行緒的例子,如果某個後台操作比較費時間,我們就可以啟動乙個執行緒去執行那個費時的操作,同時程...
C 多執行緒程式設計例項 執行緒與窗體互動
c 多執行緒程式設計例項 執行緒與窗體互動 此委託允許非同步的呼叫為listbox新增item delegate void additemcallback string text private void additem string text else 資料採集方法 public void dat...