使用
Guava和
ListenableFuture你可以做类似的事情(尚未测试)
Set uniqueQueue = Sets.newConcurrentHashSet();
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, Queues.newLinkedBlockingQueue(100));
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(threadPoolExecutor);
String t1 = "abc";
if(uniqueQueue.add(t1)) {
ListenableFuture future = executorService.submit(() -> "do something with " + t1);
Futures.addCallback(future, new FutureCallback() {
@Override
public void onSuccess(String result) {
uniqueQueue.remove(t1);
}
@Override
public void onFailure(Throwable t) {
uniqueQueue.remove(t1);
}
});
}
导致
>只有当前未处理或队列中的项目才会添加到队列中(uniqueQueue)
>已处理的项目将从uniqueQueue中删除
>队列中最多只有100个项目
这个实现不处理
> submit()方法抛出的异常
> unqiueQueue中的最大项目数
根据您将数据库中的对象加载到内存中的要求,您可能需要查看Guava’s Caches.
更新: