Comment arrêter un Exécutable prévue pour l'exécution répétée après un certain nombre d'exécutions

Situation

J'ai un Exécutable. J'ai une classe qui planifie cette Praticable pour l'exécution à l'aide d'un ScheduledExecutorService avec scheduleWithFixedDelay.

Objectif

Je veux modifier cette classe à l'annexe de l'Exécutable pour le délai d'exécution soit indéfiniment, ou jusqu'à ce qu'il a été exécuté un certain nombre de fois, en fonction de certains paramètres qui sont passés dans le constructeur.

Si possible, je voudrais utiliser le même Exécutable, comme il est conceptuellement la même chose qui doit être "exécuter".

Approches possibles

Approche #1

Ont deux Runnables, qui annule le programme après un certain nombre d'exécutions (qu'il garde un comte de), et un qui ne marche pas:

public class MyClass{
    private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public enum Mode{
        INDEFINITE, FIXED_NO_OF_TIMES
    }

    public MyClass(Mode mode){
        if(mode == Mode.INDEFINITE){
            scheduler.scheduleWithFixedDelay(new DoSomethingTask(), 0, 100, TimeUnit.MILLISECONDS);
        }else if(mode == Mode.FIXED_NO_OF_TIMES){
            scheduler.scheduleWithFixedDelay(new DoSomethingNTimesTask(), 0, 100, TimeUnit.MILLISECONDS);
        }
    }

    private class DoSomethingTask implements Runnable{
        @Override
        public void run(){
            doSomething();
        }
    }

    private class DoSomethingNTimesTask implements Runnable{
        private int count = 0;

        @Override
        public void run(){
            doSomething();
            count++;
            if(count > 42){
                //Cancel the scheduling.
                //Can you do this inside the run method, presumably using
                //the Future returned by the schedule method? Is it a good idea?
            }
        }
    }

    private void doSomething(){
        //do something
    }
}

Je préfère en avoir un Exécutable pour l'exécution de la méthode doSomething. Lier la planification de l'Exécutable se sent mal. Que pensez-vous de cela?

Approche #2

Ont une seule Praticable pour l'exécution du code que nous voulons exécuter périodiquement. Distincte prévue exécutable qui vérifie combien de fois le premier Exécutable a exécuter et annule quand il arrive à un certain montant. Cela peut ne pas être exacte, car il serait asynchrone. Il se sent un peu lourd. Que pensez-vous de cela?

Approche n ° 3

Étendre ScheduledExecutorService et ajouter une méthode "scheduleWithFixedDelayNTimes". Peut-être une telle catégorie existe déjà? Actuellement, je suis en utilisant Executors.newSingleThreadScheduledExecutor(); pour obtenir mon ScheduledExecutorService instance. Je aurait probablement à mettre en œuvre des fonctionnalités similaires à instancier l'étendue ScheduledExecutorService. Ce qui peut être délicat. Que pensez-vous de cela?

Aucun planificateur approche [Modifier]

Je ne pouvais pas utiliser un planificateur. Je pourrais plutôt quelque chose comme:

for(int i = 0; i < numTimesToRun; i++){
    doSomething();
    Thread.sleep(delay);
}

Et de l'exécuter dans un thread. Que pensez-vous de cela? Vous pourriez toujours utiliser l'exécutable, et d'appeler la méthode run directement.


Toutes les suggestions de bienvenue. Je suis à la recherche d'un débat afin de trouver la "meilleure pratique" la voie de la réalisation de mon objectif.

InformationsquelleAutor Spycho | 2011-09-01