Java 番石榴缓存导致许多线程停止

Java 番石榴缓存导致许多线程停止,java,multithreading,guava,Java,Multithreading,Guava,我发现很多java线程的状态是 java.lang.Thread.State:等待(停车) jsatck指令是加载guava缓存 java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000007c0e65bb8> (a com.google.common.util.concurrent.SettableFuture

我发现很多java线程的状态是 java.lang.Thread.State:等待(停车) jsatck指令是加载guava缓存

   java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for  <0x00000007c0e65bb8> (a com.google.common.util.concurrent.SettableFuture)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:445)
at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:79)
at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:143)
at com.google.common.cache.LocalCache$LoadingValueReference.waitForValue(LocalCache.java:3573)
at com.google.common.cache.LocalCache$Segment.waitForLoadingValue(LocalCache.java:2306)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)
at com.google.common.cache.LocalCache.get(LocalCache.java:3953)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3957)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4875)
java.lang.Thread.State:等待(停车)
在sun.misc.Unsafe.park(本机方法)
-停车等待(com.google.common.util.concurrent.SettableFuture)
位于java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
位于com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:445)
位于com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:79)
位于com.google.common.util.concurrent.unterruptibles.getUnterruptibly(unterruptibles.java:143)
位于com.google.common.cache.LocalCache$LoadingValueReference.waitForValue(LocalCache.java:3573)
在com.google.common.cache.LocalCache$Segment.waitForLoadingValue(LocalCache.java:2306)上
位于com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2195)
位于com.google.common.cache.LocalCache.get(LocalCache.java:3953)
位于com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3957)
位于com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4875)
番石榴缓存配置

    CacheLoader<K, CacheValue<V>> loader = new CacheLoader<K, CacheValue<V>>() {
        @Override
        public CacheValue<V> load(final K key) throws Exception {
            try {
                return new CacheValue<V>(loadFromRemoting(key));

            } catch (Exception ex) {
                LogUtil.warn(LOGGER, ex)
                throw ex;
            }
        }

        @Override
        public ListenableFuture<CacheValue<V>> reload(final K key, final CacheValue<V> oldValue)
                throws Exception {
            // asynchronous refresh cache.
            ListenableFutureTask<CacheValue<V>> task = ListenableFutureTask
                    .create(new Callable<CacheValue<V>>() {
                        @Override
                        public CacheValue<V> call() {
                            try

                                return load(key);

                            } catch (Exception e) {
                                LogUtil.error(LOGGER, e)
                            }

                            return oldValue;
                        }
                    });

            refreshExecutor.submit(task);
            return task;
        }
    };


    loadingCache = CacheBuilder.newBuilder().maximumSize(20000)
            .refreshAfterWrite(getDuration(), TimeUnit.MINUTES).build(loader);
CacheLoader=new CacheLoader(){
@凌驾
公共缓存值加载(最终K键)引发异常{
试一试{
返回新的缓存值(loadFromRemoting(key));
}捕获(例外情况除外){
LogUtil.warn(记录器,ex)
掷骰子;
}
}
@凌驾
public ListenableFuture重新加载(最终K键,最终缓存值oldValue)
抛出异常{
//异步刷新缓存。
ListenableFutureTask任务=ListenableFutureTask
.create(新的可调用(){
@凌驾
公共缓存值调用(){
尝试
返回载荷(键);
}捕获(例外e){
LogUtil.error(记录器,e)
}
返回旧值;
}
});
刷新执行器。提交(任务);
返回任务;
}
};
loadingCache=CacheBuilder.newBuilder()。最大大小(20000)
.refreshAfterWrite(getDuration(),TimeUnit.MINUTES).build(loader);
**jdk版本6

还有番石榴19.0版**


任何关于gauva缓存设计的文档或代码中的错误。

如果缓存中没有元素,则需要等待它被加载。你期望发生什么?负载是异步的,为什么要等待它被加载呢<代码>加载看起来不是异步的。刷新是异步的,但Guava缓存中的初始加载是同步的。@LouisWasserman更多详细信息吗?您到底想要什么详细信息?在Guava的缓存中加载是同步的。如果缓存中没有元素,则需要等待它加载。你期望发生什么?负载是异步的,为什么要等待它被加载呢<代码>加载看起来不是异步的。刷新是异步的,但Guava缓存中的初始加载是同步的。@LouisWasserman更多详细信息吗?您到底想要什么详细信息?在Guava的缓存中加载是同步的。