Java Language Gérer l'exécution rejetée


Exemple

Si

  1. vous essayez de soumettre des tâches à un exécuteur d'arrêt ou
  2. la file d'attente est saturée (uniquement possible avec des bornes) et le nombre maximum de threads a été atteint,

RejectedExecutionHandler.rejectedExecution(Runnable, ThreadPoolExecutor) sera appelé.

Le comportement par défaut est que vous obtiendrez une RejectedExecutionException lancée sur l'appelant. Mais il existe plus de comportements prédéfinis disponibles:

  • ThreadPoolExecutor.AbortPolicy (par défaut, va lancer REE)
  • ThreadPoolExecutor.CallerRunsPolicy (exécute une tâche sur le thread de l'appelant - le bloquant )
  • ThreadPoolExecutor.DiscardPolicy (tâche silencieuse)
  • ThreadPoolExecutor.DiscardOldestPolicy ( supprimer en silence la tâche la plus ancienne dans la file d'attente et réessayer l'exécution de la nouvelle tâche)

Vous pouvez les définir en utilisant l'un des constructeurs ThreadPool:

public ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue,
                      RejectedExecutionHandler handler) // <--

public ThreadPoolExecutor(int corePoolSize,
                      int maximumPoolSize,
                      long keepAliveTime,
                      TimeUnit unit,
                      BlockingQueue<Runnable> workQueue,
                      ThreadFactory threadFactory,
                      RejectedExecutionHandler handler) // <--

Vous pouvez aussi implémenter votre propre comportement en étendant l'interface RejectedExecutionHandler :

void rejectedExecution(Runnable r, ThreadPoolExecutor executor)