2016-06-17 24 views
0

Javaメソッドを最大X秒間実行する必要があります。 X秒後にメソッドのコードが終了しない場合は、実行を続行する必要があります。Android:メソッドを実行してタイムアウト後に終了する

(ExecutorServiceクラスを使用して)次のコードを使用しようとしました。

private void execLoop(){ 
    ExecutorService executor = Executors.newSingleThreadExecutor(); 
    int iteration; 
    for(iteration=0;iteration<10;iteration++) { 
     CallableTask ct = new CallableTask(); 
     Future<String> future = executor.submit(ct); 
     try { 
      future.get(5, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } catch (TimeoutException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
class CallableTask implements Callable { 
    @Override 
    public Object call() throws Exception { 
     Log.d("TIME","executed!"); 
     int t=0; 
     boolean c = true; 
     while(c){ 
      t+=0; // infinite loop: this method will never terminate 
     } 
     return null; 
    } 
} 

私がこのコードから期待しているのは、logcatに5秒ごとに "executed!"という文字列を印刷することです。 10回。 しかし、実行は無限ループで停止します。

答えて

1

最初に、実行プログラムをシャットダウンすることはありません。その後

executor.shutdownNow(); 

、シャットダウンがあなたのスレッドを中断することによって実現されているので、あなたのCallableTaskリッスンが中断していることを確認する必要があります:あなたのexecLoop()メソッドの最後のステートメントとして次の行を追加します。 1つの方法は、t+=0の代わりにThread.sleep()を使用することです。

while(c){ 
    Thread.sleep(500); // This will be interrupted when you call shutdownNow() 
} 
関連する問題