2014-10-19 2 views
0

AbstractLoadingCacheCacheLoader에 대한 구아바의 API는 "thread-safe"및 "asynchronous"로 가득 찼습니다.LoadingCache로 비동기식 로더를 만드는 방법 <K,V>?

API에서 유감스럽게도 비동기 연기 된 로더를 어떻게 만들 수 있는지 추론 할 수 없습니다.

예를 들어, 그들은

CacheLoader<Key, Graph> loader = new CacheLoader<Key, Graph>() { 
    public Graph load(Key key) throws AnyException { 
     return createExpensiveGraph(key); 
    } 
    }; 
    LoadingCache<Key, Graph> cache = CacheBuilder.newBuilder().build(loader); 

가 지금은 YES, 다음 그래프를 그릴 경우 일부 키 값이 캐시에 포함되어 있는지 확인하려면 샘플을 가지고있다. 그러나 NO이면 스텁을 그리고 로딩을 시작하고 계속 작업하십시오 (GUI). 그런 다음로드가 완료되면 그래프를 그립니다.

가능합니까?

+0

대략적으로 'CacheLoader'는 비동기 _reloading_을 지원합니다. - 값이 이미 계산 된 경우 새로운 결과가 비동기 적으로 계산되는 동안'Cache '가 이전 결과를 계속 반환하도록 할 수 있습니다. 그러나 초기 값로드는 동 기적으로 수행됩니다. –

답변

0

이제 키의 값이 캐시에 포함되어 있는지 확인하고, 그렇다면 그래프를 그려 봅니다. 그러나 NO이면 스텁을 그리고 로딩을 시작하고 계속 작업하십시오 (GUI).

Cache#getIfPresent을 사용하고 null을 반환하는 경우 그려야합니다.

그렇지 않으면 Thread (또는 일부 유예 자에게 작업 제출) Cache#get을 시작하여 스텁을 그립니다. 그것이 돌아 오면 진짜 것을 그어 라.

+0

'HashMap'으로이 작업을 수행 할 수 있습니다. 'LoadingCache'는 무엇을합니까? –

+0

@SuzanCioc 이름에서 알 수 있듯이 로딩과 캐싱을 수행합니다. 당신이 신경 쓰지 않아도 필요할 때마다 하중이 발생합니다. 그러나이 경우에는 당신이 관심을 가지기를 기다린다. +++ 캐싱은 더 복잡한 부분이며, 만료 및 용량 옵션은 모두 자신을 어렵게 만듭니다. 그러나로드가 필요없고 캐싱이 필요없는 경우지도가 실제로 충분할 수 있습니다. – maaartinus

+0

쓰레드를 사용한다면'ConcurrentHashMap'을 사용하는 것이 좋습니다 ... –