当前位置: 首页 > 知识库问答 >
问题:

我不需要等到执行async方法调用()

赵智
2023-03-14

我需要做一些异步方法。不要等到它执行。我尝试未来,但它没有帮助。

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

正如您所见,日志打印“onFailedLogonSimulation:after”是在10秒后调用的。但我需要日志在“OnFailedLogonSimulation:before”之后每天打印。不等待单元异步方法调用完成。

共有1个答案

子车宏浚
2023-03-14

主线程在调用future.get()时被阻塞,直到任务完成。删除此调用,您的第二个日志语句将立即打印。

这正好符合你的要求。但我怀疑这是你想要的。

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

相反,将结果的处理添加到异步任务本身。然后主线程不必等待结果。

 类似资料:
  • 我需要做一些异步方法。不要等到它执行。我尝试未来,但它没有帮助。 但这里记录: 正如您所见,日志打印“onFailedLogonSimulation:after”是在10秒后调用的。但我需要日志在“OnFailedLogonSimulation:before”之后每天打印。不等待单元异步方法调用完成。

  • 问题内容: 我实际上何时需要调用此方法Runtime.getRuntime()。addShutdownHook()以及何时或为何需要关闭应用程序。任何人都可以通过举例说明一下。 谢谢 问题答案: 据我所知,我将在下面进行解释。您可以搜索它并找到很多信息。 将注册一些在程序终止时要执行的动作。您启动的程序以两种方式结束: 主线程(根)结束其运行上下文; 该程序遇到一些意外情况,因此无法继续进行。 如

  • 我有一组从基类继承的命令。基类有以下声明: 此异步方法缺少“await”运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。 显式提供任务完成返回值是否正确?

  • 问题内容: 咨询JavaDocs和该方法的源代码后,我发现: 可以看出,在处的本机方法调用在同步块之外。因此,如果不将对方法的调用放入块中,是否安全? 它是线程安全的吗?如果有多个线程尝试同时中断它怎么办?这样,本机方法将如何表现? 问题答案: 我会说是的…这是线程安全的。 原因: 如果应用程序有必要在一个块中调用,那么规范(javadoc)会这样说,并且还说出需要同步到哪个对象以获得线程安全。实

  • 我有一个这样的测试 lucene6中的在这里...从中可以链接到超类并查看是(非)。