Gibt es eine HashMap mit einer getAndWait () -Methode? Z.B. eine BlockingConcurrentHashMap-Implementierung?

8

Viele Threads füllen möglicherweise HashMap , in einigen Fällen muss ich warten (blockieren), bis ein Objekt in der HashMap existiert, wie zum Beispiel:

%Vor%

Ich frage mich, ob so etwas schon existiert, ich hasse es, Räder neu zu erfinden.

    
David Parks 17.06.2011, 16:55
quelle

5 Antworten

3

Soweit ich weiß, ist keine 'Transfer Map' verfügbar. Obwohl die Schaffung eines in der Theorie nicht zu schwierig ist.

%Vor%

Es gibt offensichtliche Ausschlüsse in dieser Klasse. Nicht zu erwähnen, die Lock-Vergröberung; Unnötig zu sagen, dass es nicht gut funktioniert, aber Sie sollten sich ein Bild von dem machen, was vor sich geht

    
John Vint 17.06.2011, 17:16
quelle
3

Verbesserung von Johns Impl, mit gezielter notify (), anstelle von "donnernder Herde", was besonders schlimm ist, wenn niemand auf einen eingefügten Schlüssel wartet

%Vor%     
irreputable 17.06.2011 17:30
quelle
3

Blockingmap4j wird genau Ihren Anforderungen entsprechen.
Sie können es bei Ссылка finden Da granulare Sperren bei der Implementierung verwendet werden, wird die Leistung nicht stark beeinträchtigt.

PS
Dies ist eine ziemlich späte Antwort auf eine Frage, die 2 Jahre alt ist. Da gibt es keine Möglichkeit, eine private Nachricht an den Autor der Frage zu senden, antworte hier.

    
quelle
1

Sie können Ihre Hashtable mit java.util.concurrent.FutureTask<ObjReturned> s am Anfang mit allen Aufgaben füllen, die Sie berechnen müssen. Sie verwenden dann einen Thread-Pool, um die Ausführung von FutureTask s zu starten. Sie können Ihre Ergebnisse asynchron mit ObjReturned obj = hashtable.get(key).get() erhalten, was warten wird, wenn der FutureTask noch nicht erledigt ist.

Wahrscheinlich möchten Sie nicht, dass ein einzelner Thread die Ergebnisse abruft, da er möglicherweise auf den Task wartet, der als letzter abgeschlossen wird. Sie könnten mehrere Abruf-Threads haben, oder Sie könnten die Schlüssel durchlaufen, wenn Sie zu lange auf eine Aufgabe warten (es gibt eine Methode FutureTask.get(waitTime, timeUnit) ).

    
toto2 17.06.2011 18:28
quelle
0

Ich bin mir nicht sicher, was deine Frage ist. Möchten Sie auf den Wert warten, wenn er nicht in der Karte enthalten ist? Sie möchten das Producer-Consumer-Muster von BlockingQueue auf einer Karte. Wenn es ist, dass ich nichts Ähnliches in der JRE oder anderswo weiß.

Google guava Mit MapMaker können Sie eine Datenverarbeitungskarte erstellen, bei der es sich um eine Karte handelt, die den Wert erstellt, wenn dieser nicht vorhanden ist, indem Sie eine Factory mit dem Typ Function & lt; Schlüssel, Wert & gt; Wenn mehrere Threads gleichzeitig diese Situation erreichen, wird der Wert erstellt und die restlichen Blöcke warten darauf. Ich weiß, dass es kein Produzent-Verbraucher ist, aber was ich anbieten kann.

    
aalku 17.06.2011 17:10
quelle