Comment puis-je mettre en œuvre la priorisation des tâches à l'aide d'un ExecutorService en Java 5?

Je suis d'exécution d'un thread mécanisme de mise en commun dans lequel j'aimerais exécuter des tâches de différentes priorités. J'aimerais avoir une belle mécanisme par lequel je peux soumettre une tâche hautement prioritaire pour le service avant de l'être programmées avant d'autres tâches. La priorité de la tâche est une propriété intrinsèque de la tâche elle-même (si j'exprime que la tâche est un Callable ou un Runnable n'est pas important pour moi).

Maintenant, superficiellement, il semble que je pourrais utiliser un PriorityBlockingQueue que la tâche de la file d'attente à mon ThreadPoolExecutor, mais que la file d'attente contient Runnable objets, ce qui peut ou peut ne pas être le Runnable tâches que j'ai soumis. De plus, si je l'ai soumis Callable tâches, il n'est pas clair comment cela serait jamais la carte.

Est-il un moyen de faire cela? J'aurais vraiment préféré ne pas rouler mes propres pour cela, depuis que je suis beaucoup plus susceptibles de se tromper de cette façon.

(D'un côté, oui, je suis conscient de la possibilité de la famine pour des travaux prioritaires dans quelque chose comme cela. Des points supplémentaires (?!) pour des solutions qui ont une garantie raisonnable de l'équité)

  • Question intéressante. Cela semble être un peu d'une surveillance dans l'API, à mon avis.
  • Si je devais deviner pourquoi il ne fait pas partie de l'API, je dirais que c'est probablement parce que la faim est une question délicate. Ils avaient besoin de fournir un nouvel ensemble de primitives pour l'équité et de l'escalade; des choses comme doit-exécuter et peut-être indéfiniment différée (note que je suis en tirant ces noms de mon cul). Je pourrais souhaiter qu'ils avaient fait, mais je ne leur en veux pas 🙂
  • Ouais, ça a du sens. Semble que ce serait une bonne chose à avoir, même si, mais quand vous pensez que vous avez besoin essentiellement d'écrire un PROCESSEUR algorithme d'ordonnancement en Java, vous êtes probablement fait quelque chose de mal.
  • JDK 6 corrige cette omission, en offrant de nouvelles newTaskFor méthodes de AbstractExecutorService qui vous permettent de contrôler la façon dont le soumis tâches sont enveloppés, et ainsi de vous permettre de revenir instances qui sont Comparables et peuvent être facilement commandés par un PriorityQueue.
InformationsquelleAutor Chris R | 2009-04-30