Android:执行一个方法并在超时后终止它

时间:2016-06-17 06:01:53

标签: java android timeout

我需要执行Java方法最多X秒。 如果方法的代码在X秒后没有终止,我需要继续执行。

我尝试使用以下代码(使用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;
    }
}

我对此代码的期望是每隔5秒打印到logcat,字符串“已执行”! 10次​​。 但是,执行会陷入无限循环。

1 个答案:

答案 0 :(得分:1)

首先,你永远不会关闭你的遗嘱执行人。将以下行添加为execLoop()方法中的最后一个语句:

executor.shutdownNow();

然后,由于通过中断线程来完成关闭,因此需要确保CallableTask监听中断。一种方法是使用Thread.sleep()代替t+=0

while(c){
    Thread.sleep(500); // This will be interrupted when you call shutdownNow()
}