Je voudrais avoir un Veuillez noter que c'est une solution J2EE afin que plusieurs threads puissent y accéder. p>
Quelle est la meilleure façon de la mettre en œuvre en Java? P> hashmap
4 Réponses :
Créer un Par exemple: P> java.util.timer code> et
java.util.timertask code> peut s'avérer utile.
timerask code> qui peut effacer , ou recréer, le
hashmap via un
Minuterie code> instance est arrangé pour qu'il soit exécuté à minuit. p>
// Public single shared hash map.
static Map<String, String> cached_map_ = new HashMap<String, String>();
public class Hash_map_resetter
extends TimerTask
{
// Constructor takes reference to containing
// Timer so it can reset itself after execution.
Hash_map_resetter(Timer a_timer) { timer_ = a_timer; }
// Clear cache.
public void run()
{
cached_map_ = new HashMap<String, String>();
System.out.println("Cached cleared");
timer_.schedule(new Hash_map_resetter(timer_), 100);
}
// Reference to containing Timer.
private final Timer timer_;
}
// Example initiation.
Timer t = new Timer();
t.schedule(new Hash_map_resetter(t), 100);
Où dois-je commencer la minuterie? Dans quelle classe?
@Odelya, la seule exigence est qu'il a accès au HashMap code> que vous souhaitez réinitialiser afin que vous puissiez simplement définir une classe imbriquée à l'intérieur de la classe contenant le
hashmap code> et commencez la minuterie dans le constructeur de la classe extérieure.
Vous voulez que chaque chose dans le hashmap soit rincé à minuit? P>
Si oui, je pense que je créerais un nouveau hashmap et la substituerait à l'original. Étant donné que la substitution est faite en une seule étape et que rien d'autre n'essaie de faire le même changement, je crois que cela devrait être le fil-sûr. P>
Tout ce qui est dans le milieu de l'accès sera autorisé à terminer son accès. Cela suppose que rien d'autre ne tient une référence à ce hashmap. P>
Si les références à la HASMAP ne sont pas consolidées à un seul endroit, je suppose que Si le hashmap n'est pas synchronisé, vous ne pouvez la modifier que d'un seul fil, non? Avoir cet appel de fil Je pense que cela couvre tous les cas. P> hashmap.clear () code> est votre meilleur pari si le hashmap est synchronisé. P>
hashmap.cpear () code>. P>
Oui, je veux que tout soit rincé à minuit. Pouvez-vous s'il vous plaît fournir des échantillons de code? Je ne l'ai pas compris de la réponse
Si votre hashmap est nommée "cache", le code pour effacer en toute sécurité serait "cache = nouveau hashmap ();"
Vous pouvez également examiner à l'aide de GUAVA edit: strong> Je dois noter que vous définissez une expiration des entrées basées sur dernier accès ou Dernière écriture , Cette suggestion ne convient donc pas à ce que vous demandez exactement, ce qui est de rincer tout une fois par nuit. Vous pouvez toujours envisager de modifier votre conception si l'utilisation d'une API tiers est une option. Guava est une bibliothèque très intelligente IMHO et non seulement pour la mise en cache. P> cachebuilder code>
, qui vous permet de créer une instance personnalisée de leur cache code>
interface. Parmi les autres fonctionnalités utiles, cachebuilder code> vous permet de définir une expiration chronométrée, etc. à vos propres extrémités. P>
Bien que les autres suggestions puissent fonctionner pour le moment de l'expiration, il est important de noter que:
expiration du hashmap peut être fait paresseusement fort> p> I.e. sans fil de moniteur! p> strong> Le moyen le plus simple de mettre en œuvre l'expiration est donc comme suit: strong> p> 1) étendre la carte de hachage em> et créez un prochain (Longue) variable, initialisée au système.CurrentTime .... dans le constructeur. Ceci sera réglé égal à la prochaine période de minuit, en millisecondes ... p> 2) Ajoutez le snippet suivant em> à la première ligne du "contenant" et "obtenez" Méthodes (ou toute autre méthode charbonnée de veiller à ce que les données ne soient pas étalées) comme suit: p>
Dois-je toujours déclarer le hashmap comme celui-ci: mapper
Merci! J'ai effectivement utilisé Joda pour la manipulation de l'heure: DateTime Date = Nouveau DateTime (). Todatemidnight (). TodateTime (); DateTime demain = date.plusdays (1); NextMidtime = demain.getmillis ();
Cool - content que cela a travaillé. La déclaration de carte synchronisée ne fera pas de mal ... Il va nettoyer votre code afin que vous n'ayez pas à vous soucier de la synchronisation sur place.
En ce qui concerne l'extension: je m'attendrais à ce que vous puissiez prolonger la méthode de la carte synchronisée.