2017-01-01 1 views
-1

Je souhaite écrire une classe qui gère de nombreuses temporisations pour différents objets, avec la possibilité de notifier ou même d'exécuter une tâche lorsque le temporisateur est terminé, ainsi que d'annuler un temporisateur.Gestion de plusieurs temporisateurs

Par exemple, si j'ai un objet x de type X avec 3 secondes minuterie qui représente l'événement d'assurance-emploi veulent être en mesure de: 1. savoir quand il est fini et faire quelque chose à ce sujet 2. Annuler si nécessaire avant d' expire

J'ai implémenté quelque chose moi-même mais je suis sûr que les bibliothèques peuvent offrir beaucoup plus. J'ai regardé ScheduledPoolExecutor mais cela ne correspond pas vraiment à mes besoins pour plusieurs raisons, comme le fait que je puisse être un seul thread et pouvoir y passer mon propre "thread".

J'ai également regardé Timer mais il a un Thread en arrière-plan pour chaque instance de Timer et c'est un gros overhead que je ne peux pas permettre.

Des idées?

+0

Pourquoi essayez-vous d'annuler préventivement une tâche et que voulez-vous faire quand il complète? Ce que je demande vraiment, c'est que vous essayez de réinventer CompletionStages? –

+0

@DavidEhrmann disons que j'ai programmé une minuterie de 5 secondes pour Timeout pour un socket réseau, mais après 2 secondes, il a reçu quelques octets, maintenant je voudrais annuler ce minuteur et en définir un nouveau. – slashms

+0

@HotAppleCyber ​​pas sûr que j'ai compris votre solution ... – slashms

Répondre

0

Une des nombreuses solutions possibles pourrait être de faire en sorte que chaque objet que vous voulez hériter d'une super-classe comme Timeable, ci-dessous (ou définir une interface ou une classe abstraite).

Avoir un seul thread qui est appelé une fois par seconde par une classe Java Timer. Le thread du minuteur accède à une liste de vos objets Timeable qu'il parcourt et appelle la méthode quantum() pour la déduire du temps restant. Ailleurs, setSecondsRemaining() est appelé pour donner à l'objet une valeur delta to timeout et l'ajouter à la liste des objets temporisés. Si vous voulez annuler le timer sur un objet, appelez sa méthode cancelTimer(). Si vous avez besoin d'une grande précision, vous devez tenir compte de la longueur de la liste des objets, du temps que prend votre fil de temps pour parcourir cette liste et travailler pour que l'activité de votre minuteur démarre vous terminez tout le travail en une seconde et que vous ne commencez pas avant la prochaine seconde arrondie. Ou vous pouvez utiliser une valeur différente de tick-tock comme 10 secondes. Plusieurs façons de gérer cela. Ci-dessous est juste un exemple approximatif pour vous aider à comprendre le concept, mais n'a pas été compilé et n'est évidemment pas la solution complétée.

classe de base (superclasse):

public class Timeable { 

    long secondsRemaining; 

    Timeable() {} 

    void setSecondsRemaining(long secondsRemaining) { 
     self.secondsRemaining = secondsRemaining; 
    } 

    long getSecondsRemaining() { 
     return secondsRemaining; 
    }   

    void cancelTimer() { 
     secondsRemaining = 0; 
    } 

    void subtractQuantum() { 
     if (secondsRemaining == 0) 
      return; 
     if (--secondsRemaining == 0) 
      timeout(); 
    } 

    void timeout() { 
     // default timeout handling here - can be overriden by child 
    } 
}