gpt4 book ai didi

java - 如何在初始化期间为 LinkedHashMap removeEldestEntry 提供自定义函数

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:22:56 26 4
gpt4 key购买 nike

考虑这个初始化

    this.cache = new LinkedHashMap<K, V>(MAX_ENTRIES+1, .75F, true) {
public boolean removeEldestEntry(Map.Entry eldest) {
}
};

有没有办法用从另一个类导入的定义替换 removeEldestEntry

我想这样做的原因是因为我有一个通用的包装类,它有一个执行器和一个缓存,但是对于不同的可运行任务,缓存 存储不同的信息,因此 LinkedHashMap.removeEldestEntry

需要不同的行为

编辑:

public class MyBufferService<K, V> {

private ThreadPoolExecutor executor;
private final Map cache;

public MyBufferService(String buffName) {
executor = new ThreadPoolExecutor(1, // corePoolSize
1, // maximumPoolSize
60, TimeUnit.SECONDS, // keepAlive
new LinkedBlockingQueue<>(10000), // workQueue
new ThreadFactoryBuilder().setNameFormat(buffName + "-MyBufferService-thread-%d").build(), // factory
new ThreadPoolExecutor.CallerRunsPolicy() // rejected execution handler
);

this.cache = new LinkedHashMap<K, V>(1000, .75F, true) {
public boolean removeEldestEntry(Map.Entry eldest) {
}
};
}
}

在上面的代码中,executor 接受任何实现了 runnable 的类,所以想象一下你有 2 个实现 runnable 的任务,每个任务都想提供由线程池执行时它自己的 removeEldestEntry 功能。

有没有办法做到这一点?

编辑 2:

    private class BufferTask implements Runnable {

private final String mystring;
private final Map cache;

BufferTask(String mystring, Map cache) throws NullPointerException {
this.mystring = mystring;
this.cache = cache;
}
@Override
public void run() {
try {
synchronized (this.cache) {
this.cache.put(this.mystring, "hi");
}
} catch (Throwable t) {
}
}
public boolean removeEldestEntry(Map.Entry eldest) {
}
}

目标实际上是让每种类型的任务提供自己的removeEldestEntry

编辑 3:

这是我提交任务的方式

public class BufferService<K, V>{

public BufferService(String bufferName) {
executor = new ThreadPoolExecutor(1, // corePoolSize
1, // maximumPoolSize
keepAliveTimeSec, TimeUnit.SECONDS, // keepAlive
new LinkedBlockingQueue<>(queueSize), // workQueue
new ThreadFactoryBuilder().setNameFormat(bufferName + "-KafkaBufferService-thread-%d").build(), // factory
new ThreadPoolExecutor.CallerRunsPolicy() // rejected execution handler
);

this.cache = new LinkedHashMap<K, V>(MAX_ENTRIES+1, .75F, true) {
public boolean removeEldestEntry(Map.Entry eldest) {
}
};
}

public void putDeferBufferTask(
String myString) throws RejectedExecutionException, NullPointerException {
executor.submit(new BufferTask(myString, this.cache));
}

}

最佳答案

如果我正确理解您的问题,您正在搜索的可能是策略 模式。通过这个你可以注入(inject)任何行为。

public MyBufferService(String buffName, Predicate<Map.Entry> removeEldestEntryImplementation) {
...
this.cache = new LinkedHashMap<K, V>(1000, .75F, true) {
public boolean removeEldestEntry(Map.Entry eldest) {
return removeEldestEntryImplementation.test(eldest);
}
};
}

不要被方法名test() 搞糊涂了,我只是在使用标准库提供的标准函数接口(interface)Predicate,它有合适的签名。

在您的 Edit 2 之后,您可以这样加入:

private class BufferTask implements Runnable, Predicate<Map.Entry> {
....
private boolean removeEldestEntry(Map.Entry eldest) {
// your mysterious code here
}
@Override
public boolean test(Map.Entry eldest) {
return removeEldestEntry(eldest);
}
}

然后将此类的一个实例传递给MyBufferService 的构造函数。

关于java - 如何在初始化期间为 LinkedHashMap removeEldestEntry 提供自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com