2010-12-28 28 views
5

Tôi đang cố gắng tạo bản đồ trong đó các mục hết thời gian chờ và xóa sau một khoảng thời gian nhất định.Bản đồ có các mục nhập thời gian/tạm thời - bộ nhớ không phải là vấn đề

Về cơ bản, <K, V> Map.put(K key, V value, long **time**) - mục nhập sẽ được đưa vào bản đồ ngay lập tức và sẽ hết hạn sau thời gian (mili giây). Tôi không cần khôi phục mục nhập đã xóa vào bất kỳ thời điểm nào trong tương lai nhưng tôi muốn đảm bảo rằng nó không còn trong bản đồ nữa.

Ví dụ: map.put("foo", "bar", 60l * 1000l) sẽ cho phép cặp khóa-giá trị này hoạt động trong bản đồ trong một phút (60long và 1000long).

Nỗ lực: sử dụng một ConcurentMap và thực hiện Map.put(K key, V value, long **time**) qua như sau:
1. gọi super.put(key, value)
2. tạo ra một chủ đề mà ngủ cho thời gian (ms)
3. gọi remove(key) để xóa mục nhập.

Câu hỏi: vui lòng nhận xét/cho tôi biết đây có phải là ý tưởng hay về tính an toàn của luồng, sự nhất quán hay bất kỳ sai sót nào trong nỗ lực của tôi hay không. Nếu bạn nghĩ rằng có một cách tốt hơn để thực hiện việc này, vui lòng cung cấp bất kỳ lời khuyên nào.

Chỉnh sửa: Cảm ơn bạn đã trả lời, bộ nhớ không phải là vấn đề ở đây, tôi thực sự chỉ quan tâm đến khoảng thời gian ngắn của các mục nhập. Cảm ơn bạn.

Trả lời

4

Thời gian là một phần thiết yếu của sự cố bạn đang giải quyết? Hay nó là một chi tiết thực hiện? Nếu sự cố bạn đang giải quyết là một trong những cách sử dụng bộ nhớ, hai khả năng khác sẽ được lưu ý:

  • Bản đồ LRU. Có một số trong số này trên web.
  • Bản đồ được hỗ trợ bởi các đối tượng WeakReference hoặc SoftReference, cho phép GC thu thập các mục đó.

EDIT

Trong trường hợp đó, có một số việc triển khai hiện có mà có thể giúp bạn tiết kiệm thời gian. Ví dụ:

+0

Cảm ơn bạn đã trả lời nhưng tôi chỉ quan tâm đến thời gian ở đây, nhớ không phải là một vấn đề. –

+0

+1 để chỉnh sửa nhanh.Tôi muốn các mục được sống cho các lượng thời gian khác nhau nhưng việc thực hiện thứ hai với Timer là rất hữu ích. Cảm ơn. –

1

Nếu bạn đang làm điều này vì một số vấn đề bộ nhớ (bản đồ là một bộ nhớ cache thời gian), bạn nên có lẽ xem xét sử dụng các tài liệu tham khảo mềm (documentation).

+1

Tôi đã không thể tìm thấy cách tham chiếu mềm cho phép tôi thời gian các đối tượng, bạn có thể cụ thể hơn một chút không? Cảm ơn. –

+1

Không có kết nối thực sự. Anh ta chỉ nói rằng thường có một kết nối giữa một bản đồ được sử dụng như một bộ nhớ đệm và các tham chiếu mềm. Bit thời gian có thể được bỏ qua. MapMaker của Guava có các tùy chọn để tạo các tham chiếu mềm, FYI. –

1

Hãy xem Guava - đó là thư viện bộ sưu tập của Google. Đặc biệt, bạn muốn xem CacheBuilder và các bản đồ tính toán của nó. Một trong những tính năng của nó là "thời gian hết hạn của các mục nhập, được đo từ lần truy cập cuối cùng hoặc lần cuối", có vẻ như chính xác những gì bạn đang tìm kiếm.

(Edited để nói về CacheBuilder, nó mới kể từ khi tôi đăng tải này và phù hợp hơn với các câu hỏi)

+0

Cảm ơn bạn đã tham khảo Guava. –