我有以下计时器代码,并且基于run方法的执行,无论它是否成功,我都想返回一个布尔值。
但是我收到错误消息: 在封闭作用域中定义的局部变量连接必须是最终的或有效的最终的。
我该如何解决这个问题来实现我想要的? 这是代码:
private boolean getSwitchesOnRc(NamedPipeClient pipe, DV_RC_EntryPoint rc_EntryPoint, int allowedAttempts, int counter){
final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
boolean connected = false;
ScheduledFuture<?> countdown = scheduler.schedule(new Runnable() {
@Override
public void run() {
connected = attemptRetrievalOfSwitches(pipe, rc_EntryPoint, allowedAttempts, counter);
}}, 1, TimeUnit.MINUTES);
return connected;
}
只需使用可调用而不是 Runnable:
<V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
Creates and executes a ScheduledFuture that becomes enabled after the given delay.
主要区别在于,Callable 可以返回值(直接通过调用 return 语句(。
然后代替
return connected;
将是
return countdown.get();
你需要调度一个可调用的而不是一个可运行的来做到这一点。
这将执行您想要的操作:
ScheduledFuture<Boolean> countdown = scheduler.schedule(new Callable<Boolean>() {
public Boolean call() {
return attemptRetrieval(...);
}}, 1, TimeUnit.MINUTES);
return countdown.get();
请注意,此方法将阻止,直到计划的调用完成。