2011-07-03 4 views
1

public void execute(Runnable command)Accédez à l'objet soumis à partir d'un ThreadPoolExecutor

Cet objet de commande contient l'objet soumis, mais il semble avoir été emballé.

Comment puis-je accéder à l'objet soumis à partir d'un exécuteur de pool de threads personnalisé? Ou n'est-ce pas une bonne idée d'essayer d'accéder à l'objet soumis depuis les méthodes before/after/execute d'un ThreadPoolExecutor?

Répondre

4

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.

+0

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. –

+0

Voir la version éditée de la réponse. J'espère que c'est utile. – Bohemian

Questions connexes