当前位置: 首页 > 面试题库 >

您是否必须加入线程以确保其计算完成

须旭
2023-03-14
问题内容

我有一个实用程序方法(用于单元测试,它确实发生了),它Runnable在另一个线程中执行一个。它启动线程运行,但不等待Thread结束,而是依靠Future。该方法的调用者可能希望get()这样做Future。但这足以确保安全地发布由Runnable?完成的计算吗?

方法如下:

private static Future<Void> runInOtherThread(final CountDownLatch ready, final Runnable operation) {
    final CompletableFuture<Void> future = new CompletableFuture<Void>();
    final Thread thread = new Thread(() -> {
        try {
            ready.await();
            operation.run();
        } catch (Throwable e) {
            future.completeExceptionally(e);
            return;
        }
        future.complete(null);
    });
    thread.start();
    return future;
}

调用Future.get()返回Future的方法后,方法的调用者是否可以安全地假定方法Runnable已完成执行,并且其结果已安全发布?


问题答案:

不,你不需要join()。呼吁get()未来就足够了。

CompletableFuture接口是的子类型Future。和javadoc中的Future状态是:

内存一致性影响:异步计算采取的操作 发生Future.get()在另一个线程中相应操作之后的操作 之前

这种先 发生后 关系足以确保安全地发布所返回的值get()

此外,get()呼叫CompletableFuture必须在完成,异常完成或取消后才能完成。



 类似资料:
  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • 问题内容: 我有一个名为的方法的对象,该方法启动三个线程。 每个线程执行完毕后,如何获得通知? 有没有办法知道一个(或全部)线程是否已完成或仍在执行? 问题答案: 你可以通过多种方式执行此操作: 在主线程中使用以阻塞方式等待每个线程完成,或者 以轮询方式(通常不鼓励使用)检查,等待每个线程完成,或者 非常规的,对于每个有问题的线程,调用来调用对象中的方法,并对每个线程进行编程以在完成时抛出未捕获的

  • 问题内容: 那么,我真的需要了解它们吗?有没有一种有趣的方法来学习堆栈,链接列表,堆等?我觉得这很无聊。 **发布此问题时,它显示了一些警告。我不可以发布这样的问题吗?管理员请澄清,我将其删除:/ 警告::您要提出的问题似乎很主观,很可能已被关闭。 好吧..我明白了,学习它们的最好方法是什么?我要看什么书?什么网站? 问题答案: 如果您想成为一名程序员,则必须学习数据结构。数据结构是您的基础,如果

  • 规范是否保证,对顺序Java流的所有操作都在当前线程中执行?(“Foreach”及“ForeachOrdered”除外) 我明确要求规范,而不是当前实现做什么。我可以自己研究当前的实现,不需要麻烦您。但是实现可能会改变,而且还有其他实现。 我之所以这么问是因为ThreadLocals:我使用一个内部使用ThreadLocals的框架。即使像company.getName()这样的简单调用最终也会使

  • 问题内容: 众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的,还是仅根据传统?假设JavaScript始终是单线程的,是否完全安全? 问题答案: 这是个好问题。我很想说“是”。我不能 通常认为JavaScript具有脚本(*)可见的单个执行线程,因此,当您输入内联脚本,事件侦听器或超时时,您将完全处于控制状态,直到从块或函数的结尾返回为止。 (*:忽略浏

  • 我们在spring boot应用程序中实现了一个计划任务,用于从MQ读取消息。在IntelliJ中调试时,我看到任务的线程被启动,然后在任务完成后进入等待状态。 这是正常的还是应该在任务完成后停止/销毁线程?此外,我们必须手动执行还是Spring会处理它(任务代码中的某些内容正在阻止它)