Ngay bây giờ tôi đang cố gắng tạo ra một nhà sản xuất/người tiêu dùng chủ đề, các nhà sản xuất thread đi qua tất cả các kết hợp có thể có của các chữ cái và tạo ra MD5 băm tương ứng của họ. Sau đó, mỗi kết hợp và băm của nó được đưa vào HashMap<String,String>
. Bây giờ trong chuỗi tiêu dùng của tôi, tôi muốn có thể sử dụng bộ sưu tập Queue<>
trên băm sao cho chuỗi tiêu dùng của tôi có thể gọi poll()
v.v ... do đó loại bỏ các giá trị atc như một Queue
nhưng vẫn cho tôi khả năng nhìn thấy cả kết hợp lẫn hàm băm của nó khi gọi poll()
Tôi sẽ đi đâu để tới đó? Tôi có số HashMap
nhưng không biết cách 'tạo' hoặc truyền nó thành Hàng đợi. Cảm ơn.Có thể tạo Hàng đợi cho bộ HashMap không?
Trả lời
Bạn không nên sử dụng HashMap mà không cần xử lý an toàn luồng của mã của bạn. Khác, bạn có thể kết thúc bằng Live-lock.
Để có thể lặp lại Bản đồ của bạn với thứ tự mà các phím được chèn vào, bạn có thể sử dụng LinkedHashMap.
Map m = Collections.synchronizedMap(new LinkedHashMap(...));
Nhà sản xuất sẽ đẩy các mục như thế này (không có gì đặc biệt):
m.put(key, object)
Người tiêu dùng sẽ thăm dò ý kiến các mục như thế này:
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
}
Các LinkedHashMap
loại giống như một sự kết hợp của một HashMap
và Queue
- nó lưu cặp khóa/giá trị mà còn nhớ thứ tự mà chúng được chèn vào. Đây có thể chính xác là loại bạn đang tìm kiếm. Không có hàm poll()
rõ ràng, nhưng nếu bạn nhận được một trình lặp trên LinkedHashMap
, bạn sẽ truy cập các phần tử theo thứ tự chúng được thêm vào. Sau đó, bạn có thể viết một chức năng như sau:
public <KeyType, ValueType> KeyType first(LinkedHashMap<KeyType, ValueType> map) {
assert !map.isEmpty();
return map.iterator().next();
}
sẽ cung cấp cho bạn phần tử đầu tiên. Chỉ cần đảm bảo đồng bộ hóa một cách thích hợp.
Hoặc, bạn có thể xem xét chỉ lưu trữ cặp khóa/giá trị bên trong một Queue
bằng cách xác định lớp trợ giúp Pair
và sau đó lưu trữ Pair
s trong hàng đợi.
Hy vọng điều này sẽ hữu ích!
Nice, nên anh sẽ chỉ cần một số SyncObject để tín hiệu khi có thể đọc từ LinkedHashMap ở phía người tiêu dùng. –
Xin chào, LinkedHashMap không phải là chủ đề an toàn và nó không thuộc loại Queue. – sperumal
@ sperumal- Tôi chưa từng nói rằng một trong hai trường hợp này là như vậy. Tôi giả định rằng OP sẽ cung cấp mã đồng bộ hóa. Ngoài ra, tôi không tin rằng có bất kỳ yêu cầu nào mà nó phải thuộc loại 'Queue'; câu hỏi của OP không bao giờ đề cập đến điều này. Nếu đây là một yêu cầu, thì cách tiếp cận này chắc chắn sẽ không hoạt động. – templatetypedef
Tôi đề nghị bạn tạo một Queue của entrySet -
Queue<EntrySet<String,String>> queue = new SynchronousQueue<EntrySet<String,String>>();
for (EntrySet<String,String> entry:map.entrySet()) {
queue.add(entry);
}
Bạn có thể xem xét sử dụng một loại hàng đợi, cho phép bạn đặt các yếu tố, và chỉ chờ đợi prdocuer trong trường hợp không có sản phẩm nào như LinkedBlockingQueue.
Sau đó, nhà sản xuất có thể định lại bản đồ dựa trên các đối tượng EntrySet, nếu cần.
Hmm này có vẻ như là một phương pháp tốt. Cảm ơn bạn tôi sẽ thử. Một câu hỏi là chủ đề này có an toàn không? –
- 1. Hàng đợi ưu tiên cho đối tượng HashMap trong Java
- 2. Có thể có nhiều hàng đợi sự kiện AWT không?
- 3. Tạo hàng đợi tải lên
- 4. Có thể tạo Trình quản lý hàng đợi trên Websphere nhưng không kết nối
- 5. Có triển khai hàng đợi chuẩn cho C không?
- 6. C++ có hàng đợi tiêu chuẩn không?
- 7. Có thư viện hashmap cho JavaScript không?
- 8. Tạo hàng đợi email bằng PHP?
- 9. Đồng bộ hóa một Hàng đợi
- 10. Có thể đổi tên khóa Hashmap không?
- 11. Không tạo hàng đợi tự động trong NServiceBus
- 12. Việc đình chỉ một hàng đợi công văn có đình chỉ hàng đợi đích không?
- 13. Tự động tạo hàng đợi thông báo không đồng bộ trong Java
- 14. Tạo hàng đợi động với Celery
- 15. Tkinter: Đợi mặt hàng trong hàng đợi
- 16. Tăng Hàng đợi Tin nhắn không dựa trên hàng đợi tin nhắn POSIX? Không thể chọn (2)?
- 17. Hàng đợi ưu tiên có thể thay đổi đồng thời
- 18. C# Hàng đợi hoặc ServiceBus không có phụ thuộc?
- 19. Hàng đợi chặn đồng bộ pthread
- 20. MSMQ - Không thể nhận được từ hàng đợi Multicast
- 21. Hàng đợi có thể lặp lại bằng Python
- 22. Tôi có thể tạo hàng đợi định kỳ lại khi đang bay
- 23. Có thể có một hashmap với 4 đối tượng không?
- 24. Hàng đợi thông báo có lỗi thời trong linux không?
- 25. Hàng đợi không thể thay đổi trong Clojure
- 26. Đang khởi tạo Hàng đợi bằng {a, b, c} có thể trong C#?
- 27. Hàng đợi công việc không đồng bộ cho dịch vụ web ở Clojure
- 28. thể tạo HashMap với mùa xuân nhưng không thể tạo Bản đồ
- 29. Chỉ có thể sử dụng -performBlock: trên NSManagedObjectContext được tạo với hàng đợi
- 30. Tại sao không có hàng đợi đồng bộ chung trong .NET?
Cảm ơn bạn đã làm việc này một cách quyến rũ và nhanh chóng, dễ dàng và rõ ràng để triển khai –