[英]Scheduling Tasks in another Task Java
我開發了一個程序,該程序每兩分鍾調用一次db以檢查新任務
public static void main(String[] args) {
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleWithFixedDelay(new ESMSCampaignTask(), 0, 2, TimeUnit.MINUTES);
}
現在下面的代碼從數據庫檢查並執行線程
public void run() {
ExecutorService execService = Executors.newFixedThreadPool(5);
List<ScheduledCampaigns> scheduledCampaignsList = campaignsService.getScheduledCampaigns();
for (ScheduledCampaigns campaign : scheduledCampaignsList) {
String cmpName = "SCH_CAMPAIGNS_" + campaign.getCampaign_id();
execService.execute(new Runnable() {
public void run() {
smppService.submitShortMessage(campaign);
}
});
}//EO For Loop
}//EO Run
我正在尋找的解決方案是如何獲取上述線程的完成狀態,以便相應地更新數據庫?
我試圖execService.awaitTermination(500,TimeUnit.SECONDS);
但是,在現有線程完成其任務之前,我將無法啟動新線程。
因此,解決方案應提供這樣的功能,即每隔兩分鍾我就可以啟動新線程,而無需等待現有線程完成,同時我不斷獲取線程完成狀態,因此可以相應地更新數據庫。
問候,
如果使用ExcecutorService.submit()
而不是execute
,則可以獲取Future
對象。 將其存儲在向量中,然后可以遍歷此向量中的項目以檢查其完成狀態。
/** keep track of currently running tasks */
Vector runningTasks<Future> = new Vector<Future>();
public void run(){
for (ScheduledCampaigns campaign : scheduledCampaignsList) {
String cmpName = "SCH_CAMPAIGNS_" + campaign.getCampaign_id();
Future f = execService.submit(new Runnable() {
public void run() {
smppService.submitShortMessage(campaign);
}
});
runningTasks.add(f);
}//EO For Loop
// which tasks have just completed?
Vector<Future> justCompletedTasks = new Vector<Future>();
// check currently executing tasks
for (Future task : runningTasks){
if( task.isDone() || tasks.isCancelled() ){
justCompletedTasks.add(task);
}
} // EO check executing tasks
// remove completed tasks from current list
runningTasks.removeAll(justCompletedTasks);
} // EO run
抱歉,這是未經測試的,但是希望這個想法有用嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.