日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

30秒缓存

發(fā)布時(shí)間:2025/6/16 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 30秒缓存 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

緩存類:

package test;

import java.util.AbstractMap;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
* 用來存儲(chǔ)短暫對(duì)象的緩存類,實(shí)現(xiàn)Map接口,內(nèi)部有一個(gè)定時(shí)器用來清除過期(30秒)的對(duì)象。
* 為避免創(chuàng)建過多線程,沒有特殊要求請(qǐng)使用getDefault()方法來獲取本類的實(shí)例。
* 此代碼來源于互聯(lián)網(wǎng)
* @param <K>
* @param <V>
*/

public class CacheMap<K, V> extends AbstractMap<K, V> {
//過期時(shí)間為30秒
private static final long DEFAULT_TIMEOUT = 30000;
private static CacheMap<Object, Object> defaultInstance;

public static synchronized final CacheMap<Object, Object> getDefault() {
if (defaultInstance == null) {
defaultInstance = new CacheMap<Object, Object>(DEFAULT_TIMEOUT);
}
return defaultInstance;
}

private class CacheEntry implements Entry<K, V> {
long time;
V value;
K key;

CacheEntry(K key, V value) {
super();
this.value = value;
this.key = key;
this.time = System.currentTimeMillis();
}

@Override
public K getKey() {
return key;
}

@Override
public V getValue() {
return value;
}

@Override
public V setValue(V value) {
return this.value = value;
}
}

private class ClearThread extends Thread {
ClearThread() {
setName("clear cache thread");
}

public void run() {
while (true) {
try {
long now = System.currentTimeMillis();
Object[] keys = map.keySet().toArray();
for (Object key : keys) {
CacheEntry entry = map.get(key);
if (now - entry.time >= cacheTimeout) {
synchronized (map) {
map.remove(key);
}
}
}
Thread.sleep(cacheTimeout);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

private long cacheTimeout;
private Map<K, CacheEntry> map = new HashMap<K, CacheEntry>();

public CacheMap(long timeout) {
this.cacheTimeout = timeout;
new ClearThread().start();
}

@Override
public Set<Entry<K, V>> entrySet() {
Set<Entry<K, V>> entrySet = new HashSet<Map.Entry<K, V>>();
Set<Entry<K, CacheEntry>> wrapEntrySet = map.entrySet();
for (Entry<K, CacheEntry> entry : wrapEntrySet) {
entrySet.add(entry.getValue());
}
return entrySet;
}

@Override
public V get(Object key) {
CacheEntry entry = map.get(key);
return entry == null ? null : entry.value;
}

@Override
public V put(K key, V value) {
CacheEntry entry = new CacheEntry(key, value);
synchronized (map) {
map.put(key, entry);
}
return value;
}
}

調(diào)用緩存類:

package test;

/**
* 調(diào)用步驟:
* 1:向緩存類中存放一個(gè)key和Value
* 2:30秒之前使用get(key)取出的是value
* 3:30秒后使用get(key)取出的是null
* @author xuming
*
*/
public class run {

public static void main(String[] args) {
//實(shí)例化CacheMap方法
CacheMap c = CacheMap.getDefault();
c.put("k1","v1");
//存放時(shí)的時(shí)間戳
double currentTime =System.currentTimeMillis();
for(int i = 0;i<500000;i++){
//當(dāng)前的時(shí)間差---獲取get(key)
System.out.println((System.currentTimeMillis()-currentTime)/10000+"秒---"+c.get("k1"));
}
}

}

轉(zhuǎn)載于:https://www.cnblogs.com/Xmingzi/p/7886722.html

總結(jié)

以上是生活随笔為你收集整理的30秒缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。