我不需要等到执行异步方法 call()
I need not wait until executing async method call()
我需要做一些异步方法。而不是等到它执行。我尝试使用 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
如您所见,日志打印“onFailedLogonLimitAttempt: after”是在 10 秒后调用。
但是我需要在“onFailedLogonLimitAttempt: before”之后立即打印日志。不等待单元异步方法调用完成。
主线程在调用 future.get()
时被阻塞,直到任务完成。删除此调用,您的第二个日志语句将立即打印。
这正好解决了您的问题。但我怀疑这是你想要的。
提交异步任务的目的是允许主线程立即进行其他工作。如果主线程需要任务的结果才能继续,该任务不是异步执行的候选对象。
相反,将结果的处理添加到异步任务本身。那么主线程就不用等待结果了
我需要做一些异步方法。而不是等到它执行。我尝试使用 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
如您所见,日志打印“onFailedLogonLimitAttempt: after”是在 10 秒后调用。 但是我需要在“onFailedLogonLimitAttempt: before”之后立即打印日志。不等待单元异步方法调用完成。
主线程在调用 future.get()
时被阻塞,直到任务完成。删除此调用,您的第二个日志语句将立即打印。
这正好解决了您的问题。但我怀疑这是你想要的。
提交异步任务的目的是允许主线程立即进行其他工作。如果主线程需要任务的结果才能继续,该任务不是异步执行的候选对象。
相反,将结果的处理添加到异步任务本身。那么主线程就不用等待结果了