private void asyncRefresh ( ) { // Immediately return if refresh already in progress if ( asyncRefreshing . compareAndSet ( false , true ) ) { try { executor . submit ( new Runnable ( ) { @ Override public void run ( ) { try { refreshValue ( ) ; } finally { asyncRefreshing . set ( false ) ; } } } ) ; } catch ( RuntimeException ex ) { asyncRefreshing . set ( false ) ; throw ex ; } } }
Used to asynchronously refresh the value . Caller is never blocked .