J'ai résolu ce problème d'une façon raisonnable, et je vais vous décrire ci-dessous pour référence future à moi-même et personne d'autre qui s'exécute ce problème avec Java Simultanées des bibliothèques.
À l'aide d'un PriorityQueue
que les moyens de les accrocher à des tâches pour l'exécution ultérieure est en fait un mouvement dans la bonne direction. Le problème est que l' PriorityQueue
doit être générique instancié pour contenir Runnable
des cas, et il est impossible d'appeler compareTo
(ou similaire) sur un Runnable
interface.
Sur la résolution du problème. Lors de la création de l'Exécuteur testamentaire, il doit être donné une PriorityQueue
. La file d'attente doit être donné une coutume Comparateur d'effectuer correctement en place le tri:
new PriorityBlockingQueue<Runnable>(size, new CustomTaskComparator());
Maintenant, un coup d'oeil à l' CustomTaskComparator
:
public class CustomTaskComparator implements Comparator<MyType> {
@Override
public int compare(MyType first, MyType second) {
return comparison;
}
}
Tout semble assez simple jusqu'à ce point. Cela devient un peu collant ici. Notre prochain problème est de traiter avec la création de FutureTasks de l'Exécuteur testamentaire. À l'Exécuteur, nous devons remplacer newTaskFor
comme:
@Override
protected <V> RunnableFuture<V> newTaskFor(Callable<V> c) {
//Override the default FutureTask creation and retrofit it with
//a custom task. This is done so that prioritization can be accomplished.
return new CustomFutureTask(c);
}
Où c
est le Callable
de la tâche que nous essayons de nous exécuter. Maintenant, nous allons jeter un coup d'oeil à l' CustomFutureTask
:
public class CustomFutureTask extends FutureTask {
private CustomTask task;
public CustomFutureTask(Callable callable) {
super(callable);
this.task = (CustomTask) callable;
}
public CustomTask getTask() {
return task;
}
}
Avis de l' getTask
méthode. Nous allons l'utiliser plus tard pour attraper la tâche d'origine de cette CustomFutureTask
que nous avons créé.
Et enfin, nous allons modifier la tâche d'origine que nous avons tenté de l'exécuter:
public class CustomTask implements Callable<MyType>, Comparable<CustomTask> {
private final MyType myType;
public CustomTask(MyType myType) {
this.myType = myType;
}
@Override
public MyType call() {
//Do some things, return something for FutureTask implementation of `call`.
return myType;
}
@Override
public int compareTo(MyType task2) {
return new CustomTaskComparator().compare(this.myType, task2.myType);
}
}
Vous pouvez voir que nous mettons en oeuvre Comparable
dans la tâche à déléguer à la réelle Comparator
pour MyType
.
Et là vous l'avez, personnalisé, de la hiérarchisation de l'Exécuteur testamentaire, en utilisant les bibliothèques Java! Il prend un peu de flexion, mais c'est le plus propre que j'ai été en mesure de venir avec. J'espère que c'est utile à quelqu'un!