Java ConcurrentHashMap 设置过期时间 - 扩展实现
ConcurrentHashMap\u003CString, Object\u003E 是 Java 中的线程安全的哈希表实现,它不支持直接设置过期时间。但是,你可以通过编写额外的逻辑来实现对 ConcurrentHashMap 中的键值对设置过期时间的功能。\n\n一种常见的实现方式是使用一个后台线程来定期检查键值对的过期情况,并删除过期的键值对。下面是一个简单的示例代码:\n\njava\nimport java.util.concurrent.*;\n\npublic class ExpiringConcurrentHashMap\u003CK, V\u003E extends ConcurrentHashMap\u003CK, V\u003E {\n private final ConcurrentHashMap\u003CK, Long\u003E expirationTimeMap = new ConcurrentHashMap\u003C\u003E();\n private final ScheduledExecutorService expirationScheduler = Executors.newSingleThreadScheduledExecutor();\n\n public ExpiringConcurrentHashMap() {\n startExpirationScheduler();\n }\n\n @Override\n public V put(K key, V value) {\n expirationTimeMap.put(key, System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10)); // 设置过期时间为10秒\n return super.put(key, value);\n }\n\n @Override\n public V remove(Object key) {\n expirationTimeMap.remove(key);\n return super.remove(key);\n }\n\n private void startExpirationScheduler() {\n expirationScheduler.scheduleAtFixedRate(() -> {\n long currentTime = System.currentTimeMillis();\n for (K key : expirationTimeMap.keySet()) {\n long expirationTime = expirationTimeMap.get(key);\n if (currentTime > expirationTime) {\n expirationTimeMap.remove(key);\n super.remove(key);\n }\n }\n }, 0, 1, TimeUnit.SECONDS); // 每隔1秒检查一次过期情况\n }\n}\n\n\n在这个示例中,我们继承了 ConcurrentHashMap,并添加了一个额外的 expirationTimeMap 来保存键值对的过期时间。在 put 方法中,我们将当前时间加上一个固定的过期时间,然后将其存储到 expirationTimeMap 中。在 startExpirationScheduler 方法中,我们启动了一个后台线程来定期检查过期情况,并删除过期的键值对。\n\n使用这个自定义的 ExpiringConcurrentHashMap 类来设置过期时间:\n\njava\nExpiringConcurrentHashMap\u003CString, Object\u003E map = new ExpiringConcurrentHashMap\u003C\u003E();\nmap.put("key1", "value1"); // 设置键值对,并且在10秒后过期\n\n\n请注意,这只是一个简单的示例,实际应用中可能需要更复杂的实现来处理并发和性能问题。
原文地址: https://www.cveoy.top/t/topic/pwCW 著作权归作者所有。请勿转载和采集!