W tej chwili próbuję utworzyć wątek producenta/konsumenta, wątek producenta przechodzi przez wszystkie możliwe kombinacje liter i tworzy ich odpowiednie skróty MD5. Następnie każda kombinacja i jej skrót zostanie umieszczony w HashMap<String,String>
. Teraz w moim wątku konsumenckim chcę móc używać kolekcji Queue<>
na mapie mieszającej, więc mój wątek konsumencki może wywoływać poll()
itd., Usuwając w ten sposób wartości atc takie jak Queue
, ale nadal daje mi możliwość zobaczenia zarówno kombinacji jak i jej skrótu przy wywoływaniu poll()
Jak miałbym to zrobić? Mam HashMap
, ale nie wiem jak "zrobić" lub rzucić go jako kolejkę. Dzięki.Czy można utworzyć kolejkę do zestawu HashMap?
Odpowiedz
Nie należy używać HashMap bez obsługi bezpieczeństwa wątków kodu. W przeciwnym razie możesz skończyć z Live-lock.
Aby móc iterować mapę w kolejności, w której zostały włożone klucze, można użyć LinkedHashMap.
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Producent doprowadziłaby wpisy jak ten (nic specjalnego):
m.put(key, object)
Konsument ankiecie wpisy tak:
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
}
Typ LinkedHashMap
jest jak kombinacji HashMap
i Queue
- przechowuje pary klucz/wartość, ale także zapamiętuje kolejność, w jakiej zostały one wstawione. Może to być dokładnie ten typ, którego szukasz. Nie ma wyraźnej funkcji poll()
, ale jeśli otrzymasz iterator od LinkedHashMap
, odwiedzisz elementy w kolejności, w jakiej zostały dodane. Możesz prawdopodobnie napisać taką funkcję:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
, która zwróci Ci pierwszy element. Po prostu upewnij się, że synchronizujesz odpowiednio.
Alternatywnie można rozważyć tylko przechowywania pary klucz/wartość wewnątrz Queue
definiując klasę pomocniczą Pair
a następnie przechowywania Pair
S w kolejce.
Mam nadzieję, że to pomoże!
Nicea, więc po prostu trzeba trochę SyncObject do sygnalizować, kiedy możliwe jest odczytanie z LinkedHashMap po stronie konsumenta. –
Witam, LinkedHashMap nie jest bezpieczny dla wątków i nie jest typu Kolejka. – sperumal
@ sperumal- nigdy nie insynuowałem, że jedno z nich miało miejsce. Zakładałem, że PO dostarczy kod synchronizacji. Ponadto, nie uważam, że istnieje jakiekolwiek wymaganie, że musi to być typ 'Queue'; pytanie PO nigdy o tym nie wspomina. Jeśli jest to wymaganie, to takie podejście z pewnością nie zadziała. – templatetypedef
Proponuję utworzyć kolejkę EntrySet -
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
Można rozważyć zastosowanie innego rodzaju kolejki, która pozwala umieścić elementy i tylko czeka prdocuer w przypadku non pusty takich jak LinkedBlockingQueue.
W razie potrzeby producent może ponownie skomponować mapę na podstawie obiektów EntrySet.
Hmm, to wygląda na dobrą metodę. Dziękuję, spróbuję. Jedno pytanie, czy ten wątek jest bezpieczny? –
- 1. Czy można utworzyć mapę z listą kluczy?
- 2. Jak utworzyć literał HashMap?
- 3. Jak utworzyć kolejkę z wieloma pracownikami?
- 4. utworzyć niestandardowy sekwencyjną globalnej wysyłki kolejkę
- 5. można utworzyć HashMap z wiosny, ale nie mogą tworzyć Mapa
- 6. Czy można łatwo subskrybować domyślną kolejkę błędów w programie EasyNetQ?
- 7. Czy zawieszenie kolejki wysyłkowej zawiesza kolejkę docelową?
- 8. Jak utworzyć HashMap ze strumieniami przesłaniającymi duplikaty?
- 9. Jak utworzyć histogram z hashmap w python?
- 10. Czy można utworzyć alias szablonu?
- 11. Czy można utworzyć wektor bitsets?
- 12. Czy można utworzyć przezroczyste płótno?
- 13. Czy można utworzyć wektor wskaźników?
- 14. Gson do HashMap
- 15. przekonwertować obiekt [] z zestawu kluczy hashmap na ciąg []?
- 16. Jak utworzyć kolejkę wiadomości związanych z pamięcią w programie Erlang?
- 17. HashMap w HashMap
- 18. Sprawdź, czy obiekt jest instancją String, HashMap lub HashMap []
- 19. Jak wyświetlić wspólną kolejkę Runnera
- 20. Czy można utworzyć cel "nadzbiór" w Xcode?
- 21. Czy można utworzyć użytkownika postgresql z dostępem do wszystkich tabel?
- 22. Czy można utworzyć pulę obiektów podobną do łańcucha?
- 23. Czy można utworzyć ciąg w podobny sposób do std :: cout?
- 24. Czy można utworzyć 9-plasterkowy program do rysowania objaśnień?
- 25. Czy można utworzyć wiązania kryształów dla Ruby?
- 26. Czy można utworzyć stronę facebook z api grafu?
- 27. Nie można załadować pliku lub zestawu "MyAssembly.XmlSerializers
- 28. Czy można utworzyć obiekt wielokropka (`...`) od podstaw?
- 29. Czy można utworzyć dynamiczny motyw w Chrome?
- 30. Wdrażanie HashMap
Dziękuję, że to zadziałało i było szybkie, łatwe i jasne do wdrożenia –