Esiste un modello di progettazione per rimuovere elementi da una mappa hash?

0

Nella mia applicazione tengo traccia dei thread in esecuzione tramite una mappa hash, in questo modo posso recuperare il thread corretto e fare qualsiasi azione. L'app si è evoluta in modo da creare nuovi thread e i vecchi thread devono essere distrutti. La mia preoccupazione è se rimuovo correttamente gli elementi dell'hash, o se c'è un motivo efficiente.

Sto sviluppando in Java ma condividerò lo pseudo codice:

# HashMap mainHashmap already initialized
List toDelete = new List();
# First step, stop the threads
For (each element in HashMap)
{
  if (element.value is ThreadA)
  {
    element.value.stopThread();
    toDelete.add(element.key);
  }
 }
 # Then remove the element from the array
 For (each key in toDelete)
 {
    mainHashmap.remove(key);
 }

Grazie

    
posta 02.05.2013 - 11:59
fonte

1 risposta

2

Un paio di problemi che posso vedere con questo sono i seguenti:

  1. L'interruzione di un thread come questo è pericoloso poiché non hai idea di cosa stia facendo in quel particolare momento. Di solito in una situazione come questa, invierai un messaggio chiedendogli di fermarsi quando è conveniente, e il thread può fermarsi a suo modo (chiudere le risorse e le connessioni, ecc.). Una volta che ciascun thread è stato arrestato (quando viene richiamato il callback che indica che è stato arrestato), puoi eseguire l'azione appropriata per rimuoverlo dalla tua mappa hash.

  2. Il secondo problema è un po 'più sottile. Non vedo nessuna serratura qui, quindi devo supporre che non ce ne siano. Devi essere sicuro che questo metodo non può essere eseguito mentre un altro thread lo sta eseguendo o ottieni tutti i tipi di problemi che sembrano accadere solo una volta ogni tanto in momenti casuali. In generale, qualsiasi accesso a questa mappa di hash deve essere bloccato o non deve essere pubblico e i metodi utilizzati per accedervi sono bloccati.

Se i thread in esecuzione sono tuoi e sei abbastanza sicuro che questi thread possono essere fermati su una monetina, allora # 1 non è un problema, tuttavia sappi che è un anti-pattern. La maggior parte delle lingue supporta l'interruzione bruscamente di un thread solo perché dovrebbe ancora esistere come ultima opzione, ma normalmente chiederei gentilmente se il thread potrebbe fermarsi per te. Se il thread ignora la richiesta (in particolare questi thread non stanno eseguendo il codice che hai creato tu stesso), puoi quindi considerare la possibilità di interrompere definitivamente il thread.

Non riesco ad essere troppo specifico perché dipende molto dalla lingua che stai usando, ma la maggior parte delle lingue ha un metodo "fatto" che viene eseguito al termine (o interrotto), e potresti approfittare di questo metodo chiamando il pool di thread con quell'istanza per indicare che il thread è stato arrestato e può essere rimosso.

    
risposta data 02.05.2013 - 12:23
fonte

Leggi altre domande sui tag