我需要执行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次。 但是,执行会陷入无限循环。
答案 0 :(得分:1)
首先,你永远不会关闭你的遗嘱执行人。将以下行添加为execLoop()
方法中的最后一个语句:
executor.shutdownNow();
然后,由于通过中断线程来完成关闭,因此需要确保CallableTask
监听中断。一种方法是使用Thread.sleep()
代替t+=0
:
while(c){
Thread.sleep(500); // This will be interrupted when you call shutdownNow()
}