(K key, CacheLoader<? super K, V> loader)
| 3583 | |
| 3584 | |
| 3585 | public ListenableFuture<V> loadFuture(K key, CacheLoader<? super K, V> loader) { |
| 3586 | try { |
| 3587 | stopwatch.start(); |
| 3588 | V previousValue = oldValue.get(); |
| 3589 | if (previousValue == null) { |
| 3590 | V newValue = loader.load(key); |
| 3591 | return set(newValue) ? futureValue : Futures.immediateFuture(newValue); |
| 3592 | } |
| 3593 | ListenableFuture<V> newValue = loader.reload(key, previousValue); |
| 3594 | if (newValue == null) { |
| 3595 | return Futures.immediateFuture(null); |
| 3596 | } |
| 3597 | // To avoid a race, make sure the refreshed value is set into loadingValueReference |
| 3598 | // *before* returning newValue from the cache query. |
| 3599 | return Futures.transform(newValue, new Function<V, V>() { |
| 3600 | @Override |
| 3601 | public V apply(V newValue) { |
| 3602 | LoadingValueReference.this.set(newValue); |
| 3603 | return newValue; |
| 3604 | } |
| 3605 | }); |
| 3606 | } catch (Throwable t) { |
| 3607 | ListenableFuture<V> result = setException(t) ? futureValue : fullyFailedFuture(t); |
| 3608 | if (t instanceof InterruptedException) { |
| 3609 | Thread.currentThread().interrupt(); |
| 3610 | } |
| 3611 | return result; |
| 3612 | } |
| 3613 | } |
| 3614 | |
| 3615 | |
| 3616 | public long elapsedNanos() { |
no test coverage detected