我需要做一些异步方法。不要等到它执行。我试着用Future,但无济于事。
Future<Boolean> future = executorService.submit(new MyCallable());
LOGGER.info("onFailedLogonLimitAttempt: before");
if (future.get().booleanValue()) {
// some code here
}
LOGGER.info("onFailedLogonLimitAttempt: after");
public class MyCallable implements Callable<Boolean> {
// The call() method is called in order to execute the asynchronous task.
@Override
public Boolean call() throws Exception {
try {
LOGGER.info("MyCallable: start");
Thread.sleep(10000L);
LOGGER.info("MyCallable: alarm_cleanup_stop 10 seconds");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return true;
}
}
但这里的日志:
2022-03-24 17:28:55.436 INFO [SomeClass:http-nio-172.19.5.163-8091-exec-10] onFailedLogonLimitAttempt: before
2022-03-24 17:28:55.436 INFO [SomeClass:pool-24-thread-1] MyCallable: start
...
...
...
2022-03-24 17:29:05.437 INFO [SomeClass:pool-24-thread-1] MyCallable: alarm_cleanup_stop 10 seconds
2022-03-24 17:29:05.441 INFO [SomeClass:http-nio-172.19.5.163-8091-exec-10] onFailedLogonLimitAttempt: after
正如您所看到的,日志打印">onFailedLogonLimit尝试:在之后;是在10秒后调用。但我需要日志在">onFailedLogonLimitAttempt:在"之前;。不等待单元异步方法调用完成。
主线程在调用future.get()
时被阻塞,直到任务完成。删除此调用,您的第二条日志语句将立即打印出来。
这完全符合你的要求。但我怀疑这是否是你想要的。
提交异步任务的目的是允许主线程立即执行其他工作如果主线程需要任务的结果才能继续,则该任务不是异步执行的候选任务。
相反,将结果的处理添加到异步任务本身。那么主线程就不必等待结果了。