C 執行緒程式設計例項

2021-07-05 11:53:58 字數 3427 閱讀 7538

直接**

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...