0

我开发了一个程序,每两分钟调用一次 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);

但是在现有线程完成任务之前,我将无法启动新线程。

所以解决方案应该提供这样的功能,我可以在每两分钟后启动新线程而无需等待现有线程完成,同时我继续获取线程完成的状态,因此我相应地更新数据库。

问候,

4

1 回答 1

1

如果你使用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

抱歉,这是未经测试的,但希望这个想法有用吗?

于 2012-06-27T14:34:21.673 回答