2012-06-27 1 views
0

I mis au point un programme qui, après toutes les deux minutes appel db pour vérifier les nouvelles tâchesPlanification de tâches dans une autre tâche Java

public static void main(String[] args) { 
ScheduledExecutorService scheduler =  Executors.newSingleThreadScheduledExecutor(); 
scheduler.scheduleWithFixedDelay(new ESMSCampaignTask(), 0, 2, TimeUnit.MINUTES); 
} 

vérifier maintenant de code ci-dessous de DB et exécuter des fils

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 

La solution i Je cherche comment est-ce que je peux obtenir le statut d'achèvement des discussions ci-dessus afin que je mette à jour DB en conséquence?

J'ai essayé de execService.awaitTermination (500, TimeUnit.SECONDS);

Mais je ne serais pas en mesure de démarrer de nouveaux threads jusqu'à ce que les threads existants finissent leur tâche. Donc la solution devrait fournir une telle fonctionnalité que je pourrais être capable de démarrer de nouveaux threads toutes les deux minutes sans attendre les complétions des threads existants et pendant ce temps je continue à obtenir le statut de complétion des threads.

Cordialement,

Répondre

1

Si vous utilisez ExcecutorService.submit() plutôt que execute, vous pouvez obtenir un objet Future. Stockez-le dans un vecteur et vous pouvez ensuite parcourir les éléments de ce vecteur pour vérifier leur état d'achèvement.

/** 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 

Désolé, cela n'a pas été testé, mais nous espérons que l'idée vous sera utile?

+0

Il est également intéressant de vérifier [ExecutorCompletionService] (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ExecutorCompletionService.html) – eiden

Questions connexes