Сейчас я пытаюсь создать поток производителя/потребителя, поток производителя проходит через все возможные комбинации букв и создает их соответствующие хеши MD5. Затем каждая комбинация и ее хэш помещаются в HashMap<String,String>
. Теперь в моем потребительском потоке я хочу иметь возможность использовать коллекцию Queue<>
на хэшмапе, чтобы мой потребительский поток мог вызвать poll()
и т. Д., Таким образом удаляя значения atc как Queue
, но все же предоставляя мне возможность видеть как комбинацию, так и ее хэш при вызове poll()
Как мне это сделать? У меня есть HashMap
, но я не знаю, как «сделать» или бросить его как очередь. Спасибо.Возможно ли создать очередь для набора HashMap?
ответ
Вы не должны использовать HashMap, не обращаясь к потокобезопасности вашего кода. Кроме того, вы можете завершить Live-Lock.
Чтобы иметь возможность выполнять итерацию вашей карты с помощью порядка, в который были вставлены ключи, вы можете использовать LinkedHashMap.
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
продюсер подтолкнет записи, как это (ничего особенного):
m.put(key, object)
Потребитель будет опрашивать записи, как это:
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
}
Тип LinkedHashMap
подобна комбинации HashMap
и Queue
- она хранит пары ключ/значение, но и запоминает порядок, в котором они были вставлены. Это может быть именно тот тип, который вы ищете. Нет явной функции poll()
, но если вы получите итератор над LinkedHashMap
, вы увидите элементы в том порядке, в котором они были добавлены. Возможно, вы могли бы затем написать такую функцию:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
, которая вернет вам первый элемент. Просто убедитесь, что вы правильно синхронизировали.
В качестве альтернативы вы можете просто сохранить пары ключ/значение внутри Queue
, указав вспомогательный класс Pair
, а затем сохраните Pair
с в очереди.
Надеюсь, это поможет!
Ницца, так что он будет просто нужно некоторое SyncObject к сигнал, когда можно читать с LinkedHashMap на стороне потребителя. –
Привет, LinkedHashMap не является потокобезопасным, и это не тип Queue. – sperumal
@ sperumal - я никогда не намекал, что это так. Я предположил, что OP предоставит код синхронизации. Кроме того, я не считаю, что существует какое-либо требование о том, что он должен быть типа 'Queue'; вопрос ОП никогда не упоминает об этом. Если это требование, то этот подход определенно не сработает. – templatetypedef
Я предлагаю вам создать очереди EntrySet -
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
Вы можете использовать другой тип очереди, которая позволяет поместить элементы, и только prdocuer ждет в случае не пусто, таких как LinkedBlockingQueue.
Затем продюсер сможет перекомпоновать карту на основе объектов EntrySet, если это необходимо.
Хм это похоже на хороший метод. Спасибо, я попробую. Один из вопросов касается этой потоковой безопасности? –
- 1. Sidekiq: Возможно ли «приостановить» очередь?
- 2. Возможно ли создать публичную очередь в Windows Azure?
- 3. Возможно ли создать экземпляр моноида для GADT?
- 4. Возможно ли создать очередь массивов объектов в C++?
- 5. Возможно ли создать HashMap, который является Parcelable на Android?
- 6. Возможно ли создать «HashMap» с ключом типа `* const Any`?
- 7. Возможно ли сделать очередь в ThreadPoolTaskExecutor постоянным
- 8. Возможно ли создать патч с помощью набора списков изменений?
- 9. Возможно ли создать новый столбец при возврате набора результатов SQL?
- 10. Очередь в Семафорах - возможно?
- 11. Java HashMap - Нужно ли использовать .put() для каждого набора?
- 12. Возможно ли перезапустить азарную очередь (servicebus)?
- 13. Возможно ли вернуть объект HashMap в Java?
- 14. Возможно ли иметь массив, содержащий ключи HashMap?
- 15. Возможно ли иметь очередь с мертвой буквой для отдельных очередей
- 16. Создать пользовательскую очередь
- 17. Создать hashmap для JSON в javascript/jquery
- 18. Возможно ли преобразовать строку в int быстрее, чем использовать hashmap?
- 19. Возможно ли создать приложение для платформы LinkedIn?
- 20. Возможно ли создать «тихое» приложение для Android?
- 21. Возможно ли создать почтовый ящик для Zune?
- 22. Возможно ли создать службу Windows для принтеров?
- 23. Возможно ли создать Crystal binds для Ruby?
- 24. Ruby Возможно ли создать каталог для переменных?
- 25. Возможно ли создать это приложение для Quickbooks?
- 26. Git - Возможно ли создать место для хранилища?
- 27. Возможно ли создать директиву для динамического шаблона?
- 28. Возможно ли создать приложение для Linux?
- 29. Возможно ли создать API для SharePoint?
- 30. Возможно ли иметь несколько действительных BST для заданного набора данных?
Спасибо, что это сработало шармом и было быстрым, легким и понятным для реализации –