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

createExpensiveGraphメソッドが値を返すのに時間がかかる場合があります。loadメソッド内に時間制限を設定して、制限時間内にメソッドcreateExpensiveGraphが値を返さなかった場合に aTimeLimitedExceptionがスローされるようにします。loadメソッドに時間制限を設定するにはどうすればよいですか?

4

2 に答える 2

4

編集: eclps によって指摘されたように使用するように修正さnewSingleThreadExecutorれました。

aCallableと anExecutorServiceを使用して、タイムアウト動作を実装できます。

final ExecutorService executor = Executors.newSingleThreadExecutor();

final LoadingCache<Key, Graph> graphs = CacheBuilder.newBuilder()
       .maximumSize(1000)
       .build(
           new CacheLoader<Key, Graph>() {
               public Graph load(final Key key) throws Exception {
                   return executor.submit(new Callable<Graph>() {
                       @Override
                       public Graph call() {
                           return createExpensiveGraph(key);
                       }
                   }).get(MY_TIME_LIMIT_SECONDS, TimeUnit.SECONDS);
               }
           });

そしてget呼び出しサイトで:

final Graph graph;
try {
    graph = graphs.get(myKey);
}
catch (ExecutionException executionException) {
    final Throwable cause = Throwables.getRootCause(executionException);
    if (cause instanceof TimeoutException) {
        // timeout specific logic
    }
    // other error handling
}

// use graph
于 2013-08-23T05:12:23.103 に答える
3

Paul Bellora の例は、MoreExecutors.sameThreadExecutor().

javadocからMoreExecutors.sameThreadExecutor()

Future が呼び出し元に返される前に、タスクは完了するまで実行されます (executor がシャットダウンされていない場合)。

したがって、 on the Future は、実行が完了getするまで呼び出されません。または同様の Executor をcreateExpensiveGraph使用して、タイムアウトをサポートします。Executors.newSingleThreadExecutor()

于 2014-06-11T19:21:35.290 に答える