J'ai un service d'exécution qui exécute périodiquement un tas de tâches. Ils sont initialisés au démarrage et exécutés de temps en temps, jusqu'à présent.Démarrer des tâches dans ScheduledThreadPoolExecutor tôt/démarrer
Je voudrais maintenant ajouter une fonctionnalité pour démarrer l'exécution de ces tâches en fonction d'un événement.
J'ai trouvé la méthode decorateTask qui me permet de stocker les tâches que j'ai planifiées. Cependant, je ne sais pas comment je peux les faire courir? J'ai eu l'idée d'écraser la méthode Delayed dans RunnableScheduledFuture pour qu'elle renvoie 0 sur un événement prédéfini, mais je ne suis pas sûr que ce soit possible et que l'exécuteur se comporte si je le faisais?
Une autre idée serait de collecter toutes les tâches et ensuite de les soumettre pour exécution directement sur un événement. Je ne sais pas non plus comment cela se passerait.
Je ne peux pas simplement appeler les exécuter car ils fonctionneront dans le même thread.
J'espère que tout cela a du sens. Faites-moi savoir s'il y a quelque chose de flou.
public class EventBasedExecutor extends ScheduledThreadPoolExecutor implements EventBasedExecutorService {
private static final Logger log = Logger.getLogger(EventBasedExecutor.class);
private List<RunnableScheduledFuture<?>> workers = new ArrayList<>();
public EventBasedExecutor(int corePoolSize, ThreadFactory threadFactory) {
super(corePoolSize, threadFactory);
}
@Override
protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) {
workers.add(task);
return super.decorateTask(runnable, task);
}
@Override
public void executeEarly() {
// do something here to start the executors work
}
Re-soumission des tâches passe par l'exécution/code horaire et crée une nouvelle tâche de l'ancien (appellera un nouveau décorez etc.) . Je ne peux pas dupliquer les tâches, j'ai besoin de démarrer les instances existantes pour que l'exécuteur ne puisse pas les exécuter en même temps (car elles sont déjà exécutées et doivent être soumises à nouveau). – pandaadb
Qu'entendez-vous par «crée une nouvelle tâche par rapport à l'ancienne»? –
Ce que je voulais dire, c'est qu'il prend la tâche et l'enveloppe dans une tâche différente. Cependant, l'écrasement de la méthode decorateTask le fait fonctionner correctement. Le runnable passé dans la méthode est la tâche précédente. En retournant celui-là, la tâche correcte peut être démarrée. – pandaadb