我不需要等到执行异步方法 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() 时被阻塞,直到任务完成。删除此调用,您的第二个日志语句将立即打印。

这正好解决了您的问题。但我怀疑这是你想要的。

提交异步任务的目的是允许主线程立即进行其他工作。如果主线程需要任务的结果才能继续,该任务不是异步执行的候选对象。

相反,将结果的处理添加到异步任务本身。那么主线程就不用等待结果了