Ne pas utiliser execute
, utilisez submit
, qui retourne un Future
, qui est une poignée à la tâche. Voici quelques exemples de code:
ExecutorService service = Executors.newCachedThreadPool();
Callable<String> task = new Callable<String>() {
public String call() throws Exception {
return "hello world";
}
};
Future<String> future = service.submit(task);
Bien que vous ne pouvez pas accéder à la tâche directement, vous pouvez interagir avec lui:
future.cancel(); // Won't start task if not already started
String result = future.get(); // blocks until thread has finished calling task.call() and returns result
future.isDone(); // true if complete
Vous pouvez également interagir avec le service:
service.shutdown(); //etc
COMMENTAIRES ADRESSES:
Si vous voulez t pour faire quelques journalisation, utiliser un anonymous class pour remplacer la méthode afterExecute()
, comme ceci:
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(1)) {
@Override
protected void afterExecute(Runnable r, Throwable t)
{
// Do some logging here
super.afterExecute(r, t);
}
};
Remplacer les autres méthodes selon les besoins.
Prise rapide: IMHO, la bible pour ce sujet est Java Concurrency in Practice - Je vous recommande de l'acheter et de le lire.
Merci, j'utilise déjà l'appel de submit (Runnable task, V result), qui renvoie un futur. J'essaye de faire une notation dans le threadpoolexecutor, spécifiquement quelle tâche était juste accomplie, juste pour aider au debugging. L'autre option consiste à faire un blocage de get() sur le futur objet, mais cela me semble être une tâche si simple, surtout quand je peux voir la méthode afterExecute(), qui me dit qu'une tâche vient juste d'être terminée. –
Voir la version éditée de la réponse. J'espère que c'est utile. – Bohemian