java - 如何让 ScheduleTask 在某个时间执行一次任务?
问题描述
最近与 ScheduleTask 合作,我有这样一个问题。当地图大小超过MAX_SIZE
字段时,我希望我的 ScheduleTask 每 5 秒从地图中删除一次元素。我正在尝试这样做:
public class RemoverThread extends TimerTask {
private AbstractCustomCache customCache;
private static final int MAX_SIZE = 2;
public RemoverThread(AbstractCustomCache customCache) {
this.customCache = customCache;
}
@Override
public void run() {
if (customCache.getCacheEntry().size() > MAX_SIZE) {
List<String> gg = new ArrayList<>(customCache.getCacheEntry().keySet());
for (String s : gg) {
System.out.println("Element was remove: " + customCache.getCacheEntry().remove(s));
System.out.println("Time: " + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(Calendar.getInstance().getTime()));
if (customCache.getCacheEntry().size() <= MAX_SIZE) {
break;
}
}
}
}
}
我的主要:
public class Main {
public static void main(String[] args) {
AbstractCustomCacheStatistics gh = new MapCacheStatistics();
AbstractCustomCache gg = new MapCache(gh);
for (int i = 0; i < 5; i++){
gg.put("ab" + i);
}
RemoverThread removerThread = new RemoverThread(gg);
Executors.newScheduledThreadPool(2).scheduleAtFixedRate(removerThread, 5, 5, TimeUnit.SECONDS);
for (int i = 0; i < 3; i++){
gg.put("abc" + i);
}
}
}
抽象自定义缓存:
public abstract class AbstractCustomCache implements CustomCache{
private Map<String, CacheEntry> cacheEntry = new LinkedHashMap<>();
public Map<String, CacheEntry> getCacheEntry() {
return Collections.synchronizedMap(cacheEntry);
}
}
我的输出中有这个:
Element was remove: CacheEntry{field='ab0'}
Time: 2019/01/31 11:39:11
Element was remove: CacheEntry{field='ab1'}
Time: 2019/01/31 11:39:11
Element was remove: CacheEntry{field='ab2'}
Time: 2019/01/31 11:39:11
Element was remove: CacheEntry{field='ab3'}
Time: 2019/01/31 11:39:11
Element was remove: CacheEntry{field='ab4'}
Time: 2019/01/31 11:39:11
Element was remove: CacheEntry{field='abc0'}
Time: 2019/01/31 11:39:11
我究竟做错了什么?它可以如何改进?我想从地图中删除每 5 秒发生一次。例如,我添加了ab0, ab1, ab2, ab3, ab4
. 流应该删除ab0, ab1, ab2
. 由于地图中的元素大于MAX_SIZE
. 然后我添加abc0, abc1, abc2
. 并且在删除第一个元素后 5 秒,ab3, ab4, abc0
应该删除。但是,如您所见,所有项目都被同时删除。
解决方案
我究竟做错了什么?
,第一次执行的
Executors.newScheduledThreadPool(2).scheduleAtFixedRate(removerThread, 5, 5, TimeUnit.SECONDS);
时间会延迟5
几秒,此时缓存中包含:ab0 ab1 ab2 ab3 ab4 abc0 abc1 ab2
,前5个会被移除。您需要一个线程安全的版本
AbstractCustomCache customCache
,因为它是由多个线程修改的。
推荐阅读
- javascript - 如何在 View 的 ImageBackround 中添加 createStackNavigator 以获得公共背景图像?
- docker - 在没有特权或 SYS_ADMIN 模式的情况下将 s3 挂载到 docker 容器
- java - @Mock 注解不适用于对象映射器
- fortran - 使用八度音阶的 fortran 的更快方法
- sql - 为什么相同几何的 ST_Equals 返回 false?
- python - 无法使用套接字连接到热点连接上的服务器
- flutter - flutter_bloc 共享多个 bloc 的状态
- c++ - 如何使用来自另一个分支的类指针访问层次结构一个分支的类的成员?
- r - 如何过滤R中函数内的变量?
- python-2.7 - 捕获请求异常的问题