場景:系統中常常會有一些需要定時去迴圈執行的儲存過程或方法等,這時就出現了定時任務小程式。
模型:查詢需定時執行的計畫任務-->插入執行緒池-->執行任務
staticvoid
mainmethod()
//////
查詢計畫任務
///static
void
querytask()
; threadpool.queueuserworkitem(invokethreadmethod, todo_taskmodel);
}thread.sleep(
30000); //
30s迴圈一次}}
//////
完成計畫任務
//////
static
void invokethreadmethod(object
taskmodel)
......執行完成.
", model.taskid, model.itime);
}///
///任務實體
///class
taskmodel
public datetime itime
}
1.查詢計畫任務時只管有任務就推給執行緒池,不等待執行緒池中任務是否完成.(避免有些計畫任務耗時比較長,阻塞後面定時任務執行時間)每隔30秒迴圈一次計畫任務.
2.每條計畫任務完成後列印相應資訊.(也可記錄日誌)
3.如果查詢計畫任務記錄數較多,可調整相應的迴圈時間間隔。避免任務插入執行緒池時間過長阻塞後面定時任務執行時間。
模型:檢索任務-->插入執行緒池-->等待執行緒池任務完成-->提示任務完成
staticvoid
mainmethodb()
static
void
querytaskb()
; threadpool.queueuserworkitem(invokethreadmethodb, model);
}//等待所有執行緒執行完畢
countdown.waitall();
console.writeline(""
, datetime.now);
thread.sleep(
30000
); }
}static
void invokethreadmethodb(object
obj)
class
taskmodeb
public datetime itime
public mutiplethreadresetevent manualresetevent
}///
///解決問題:waithandle.waitall(evetlist)方法最大只能等待64個manualresetevent事件
///public
class
mutiplethreadresetevent
//////
喚醒乙個等待的執行緒
/// public
void
setone()
}//////
等待所以執行緒執行完畢
/// public
void
waitall()
//////
釋放物件占用的空間
/// public
void
dispose()
}
querytaskb()在檢索任務記錄數後會記錄任務條數,並例項化對應的manualresetevent陣列,做為引數傳給執行緒池中線程任務。
最後等待執行緒池中所有任務執行完成。後續可根據實際需要編寫各自業務邏輯。
兩個例項的不同點:是否等待執行緒池中的所有任務完成。
例項1中定時任務對執行的時間要求比較高,到了某個時間點必須執行某個任務。所以不能等待執行緒池中的任務完成。
例項2中資料推送程式對推送的時間要求相對1中要低一點。介面表中只要檢索到資料就推送給第三方平台。一般每次傳輸資料量不是很多,但很頻繁。
缺點:當推送資料量大時,執行任務時間可能會較長。主線程會等待執行緒池中的所有任務完成。所有每次迴圈檢索任務的時間間隔可能會出現30s+ns現象。
C 四) 執行緒與程序
c98標準中不支援執行緒建立,c11標準中才有執行緒建立支援。目前windows和linux系統都自帶建立程序和執行緒函式,程序process,執行緒thread。1 程序與執行緒 比如我們一樓有個圖書櫃,那這個圖書櫃的存在就相當於資料已經載入到記憶體中了,你在那邊讀計算機系統書,然後我過來拿起一本...
C 基礎 多執行緒筆記 四 執行緒池
現在到了關於多線最簡單使用的最後一篇筆記。無論從什麼角度來看,每一項事物都應該有其所在的空間,而對於執行緒來說,執行緒池就是它所存在的空間,或者叫容器了。接下來,看看這個執行緒池是如何使用的吧!概念 manualresetevent,通知乙個或多個正在等待的執行緒已發生事件 manualresete...
c 執行緒池實現(四)執行緒池實現
前面已經說到了同步佇列的實現,下面來看執行緒池的實現。ifndef include threadpool define include threadpool include include include include include syncqueue.hpp namespace mythrea...