Momentan versuche ich einen Producer/Consumer Thread zu erstellen, der Producer Thread durchläuft alle möglichen Buchstabenkombinationen und erzeugt die entsprechenden MD5 Hashes. Dann wird jede Kombination und ihr Hash in die HashMap<String,String>
eingegeben. Jetzt in meinem Consumer-Thread möchte ich in der Lage sein, die Queue<>
Sammlung auf der Hashmap zu verwenden, so dass mein Consumer-Thread poll()
etc aufrufen kann, wodurch Werte wie ein Queue
wie ein Queue
entfernen, aber immer noch mir die Fähigkeit zu sehen, sowohl die Kombination und seine Hash beim Aufruf Wie würde ich das machen? Ich habe die HashMap
aber weiß nicht, wie man es als eine Warteschlange "macht" oder es wirft. Danke.Ist es möglich, eine Warteschlange für HashMap-Set zu erstellen?
Antwort
Sie sollten keine HashMap verwenden, ohne die Thread-Sicherheit Ihres Codes zu behandeln. Andernfalls können Sie mit einer Live-Sperre enden.
Um die Map in der Reihenfolge durchlaufen zu können, in der die Schlüssel eingefügt wurden, können Sie eine LinkedHashMap verwenden.
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Der Hersteller würde Einträge wie diese (nichts Besonderes) drücken: zu
while (someCondition) {
Map.Entry nextEntry = null;
// This block is equivalent to polling
{
synchronized(s) {
Iterator i = s.iterator(); // Must be in the synchronized block
if (i.hasNext()) {
nextEntry = i.next();
i.remove();
}
}
}
if (nextEntry != null) {
// Process the entry
...
} else {
// Sleep for some time
...
}
// process
}
Die LinkedHashMap
Typ ist wie eine Kombination aus einem HashMap
und einem Queue
- it Schlüssel/Wert-Paaren speichert, sondern merkt sich auch die Reihenfolge, in der sie eingelegt wurden. Dies könnte genau der Typ sein, nach dem Sie suchen. Es gibt keine explizite poll()
Funktion, aber wenn Sie einen Iterator über die bekommen, werden Sie die Elemente in der Reihenfolge, in der sie hinzugefügt wurden, besuchen. Sie könnten dann wahrscheinlich eine Funktion wie diese schreiben:
, die Ihnen das erste Element zurückgeben wird. Stellen Sie nur sicher, dass Sie entsprechend synchronisieren.
Alternativ könnten Sie auch nur Schlüssel/Wert-Paare in einem Queue
speichern, indem Sie eine Hilfsklasse Pair
definieren und dann Pair
s in der Warteschlange speichern.
Hoffe, das hilft!
Nizza, so wird er brauchen nur etwas SyncObject:
m.put(key, object)
Der Verbraucher Einträge wie diese Umfrage würde signalisieren, wenn es möglich ist, von LinkedHashMap auf der Verbraucherseite zu lesen. –
Hallo, LinkedHashMap ist nicht Thread-sicher und es ist nicht vom Typ Warteschlange. – sperumal
@ sperumal- Ich habe nie angedeutet, dass einer dieser Fälle der Fall war. Ich nahm an, dass das OP den Synchronisationscode liefern würde. Ich glaube auch nicht, dass es eine Anforderung vom Typ "Warteschlange" geben muss; Die Frage des OP erwähnt dies nie. Wenn dies eine Voraussetzung ist, wird dieser Ansatz definitiv nicht funktionieren. – templatetypedef
Ich schlage vor, Sie eine Warteschlange von entrySet erstellen -
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
Sie betrachten können, eine andere Art von Warteschlange verwenden, mit dem Sie die Elemente setzen können, und nur die prdocuer wartet bei nicht leer wie LinkedBlockingQueue.
Der Producer kann dann bei Bedarf eine Karte basierend auf den EntrySet-Objekten neu zusammenstellen.
Hmm das scheint eine gute Methode zu sein. Danke, ich werde es versuchen. Eine Frage, das ist dieser Thread sicher? –
- 1. Ist es möglich, eine ListViewGroup zu erstellen
- 2. Ist es möglich, Portable VM zu erstellen?
- 3. Ist es möglich, einen Vorlagenalias zu erstellen?
- 4. Ist es möglich, transparente Leinwand zu erstellen
- 5. Ist es möglich, eine interaktive C-Shell zu erstellen?
- 6. Ist es möglich, eine Eigenschaft in Javascript zu erstellen?
- 7. Ist es möglich, eine Lösungsvorlage mit VS2008 zu erstellen?
- 8. ist es möglich, eine Sitzungsvariable innerhalb eines Threads zu erstellen?
- 9. Ist es möglich eine Kategorieseite in Magento zu erstellen?
- 10. ist es möglich, npm-Paket für SailsJs-Projekt zu erstellen?
- 11. In Swagger, ist es möglich, APIs für Websockets zu erstellen?
- 12. Ist es möglich, eine 'Befehlszeile' swf zu erstellen?
- 13. Ist es möglich, Crystal-Bindungen für Ruby zu erstellen?
- 14. Ist es möglich, eine Windows-Verknüpfung mit PHP zu erstellen?
- 15. Ist es möglich, eine "Freund-Klasse" in C++ zu erstellen?
- 16. Ist es möglich, eine Bildbibliothek in iTextsharp zu erstellen?
- 17. Ist es möglich, eine Konsolenanwendung mit nw.js zu erstellen?
- 18. Ist es möglich, in VB.NET eine gemeinsame Datenbankklasse zu erstellen?
- 19. Ist es möglich, eine plattformübergreifende, OFFLINE mobile App zu erstellen?
- 20. Ist es möglich, eine Erweiterungsmethode mit Resharper zu erstellen?
- 21. Ist es möglich, eine Umrisslinie mit Radius zu erstellen?
- 22. Ist es möglich, eine Google Fotos-Suchleiste zu erstellen?
- 23. Ist es möglich, in Node.js eine JavaScript-Funktion zu erstellen?
- 24. Ist es möglich, mit Roslyn eine Portable-Klassenbibliothek zu erstellen?
- 25. Ist es möglich, in Delphi eine Typmethode zu erstellen?
- 26. Ist es möglich, eine verknüpfte Chekbox zu erstellen?
- 27. ist es möglich, eine Liste in unserer App zu erstellen?
- 28. Ist es möglich, eine Suchmaschine für meine Website zu erstellen, ohne eine Datenbank zu haben?
- 29. Ist es möglich, eine std :: string für read() zu verwenden?
- 30. Ist es möglich, Java zu verwenden, um dll zu erstellen?
Vielen Dank das hat einen Charme und war schnell, einfach und klar zu implementieren –