2010-06-16 6 views
3

En fait j'exécuterais une tâche spécifique (un ensemble d'instructions) pour une période déterminée. Par exemple: je veux que mon programme exécute la tâche pendant 5 minutes, s'il obtient le bon résultat il s'arrête, sinon il continuera à exécuter la tâche normale pendant les 5 minutes et à la fin il me l'indique.Comment exécuter une tâche pour une période spécifique en Java.

Comment puis-je l'implémenter en Java.

Répondre

4

Vous pourriez quelque chose comme ce qui suit:

import java.util.concurrent.* ; 

ExecutorService svc = Executors.newFixedThreadPool(1) ; 
svc.submit(new Runnable() { 
    public void run() { 
    // Do long running task 
    } 
}) ; 
svc.shutdown() ; 
svc.awaitTermination(300, TimeUnit.SECONDS) ; 

Javadocs pour ExecutorService are here

[modifier]

Je dois souligner sans doute, cependant, que selon ce que votre travail de longue course fait, il peut ne pas être possible de l'obliger à arrêter de fonctionner

[edit2] la méthode submit renvoie un objet Future, w vous pouvez alors appeler geton with a timeout. Cet appel get bloquera jusqu'à ce qu'un résultat soit prêt, ou si le délai d'expiration est atteint, lancez une exception TimeoutException. De cette façon, vous pouvez obtenir un résultat de votre tâche longue si c'est ce que vous vouliez

+0

Le JavaDoc dit que 'shutdown' - lance un arrêt ordonné dans lequel les tâches précédemment soumises sont exécutées, mais aucune nouvelle tâche ne sera acceptée. - Le thread en cours ne reviendra pas immédiatement ... pensez-vous 'shutdownNow()'? –

+0

Bon point - Je vais supprimer ce commentaire. – Adamski

+0

merci :) Bonne réponse – Zakaria

0

Vous voudrez probablement utiliser une combinaison de Timer et TimerTask. Créez un nouveau Timer et appelez la méthode schedule (TimerTask, long, long) pour le démarrer. Votre objet TimerTask serait l'élément responsable de la vérification de votre condition de sortie.

+0

J'aurais dû mentionner que vous voudriez bien sûr enregistrer l'heure à laquelle le point TimerTask démarre, de sorte qu'après cinq minutes vous pouvez le tuer si votre condition de sortie ne le termine pas en premier. – Andre

0

Depuis Java 1.5, il existe une API de haut niveau pour la simultanéité. Il comprend un ensemble d'interfaces appelé Executors. Ils peuvent peut-être vous aider.

2

L'approche la plus robuste consiste à utiliser FutureTask avec un pool de threads. Voir ma réponse à cette question,

java native Process timeout

0

L'utilisation d'un avenir sont un moyen très simple, à mon avis:

ExecutorService executorService = Executors.newSingleThreadExecutor(); 
Future<?> f = executorService.submit(myTask); 
try { 
    f.get(timeout, TimeUnit.MILLISECONDS); 
} catch (TimeoutException e) { 
    f.cancel(true); 
} 

Mais bien sûr, le fil créé doivent être en mesure de gérer les interruptions .

Questions connexes