【问题标题】:Actual implementation of Callable and FutureCallable和Future的实际实现
【发布时间】:2013-01-30 17:12:55
【问题描述】:

我正在了解细粒度的 util.concurrency。 Java CallableFuture 在 JVM 中的实现在哪里?

我找到了Future class,它在 Java 语言的高层次上描述了未来,我正试图找到它在较低层次上的描述。

总而言之,找到 Future 和 Callable 的实际实现会很有趣,例如:处理 Future.get() 或 Callable.call() 并规定它们应该如何工作的 JVM 部分。

期待您的回复, 阿孔卡瓦

【问题讨论】:

  • 那么,它们不包含任何由 JVM 完成的黑魔法?
  • @Gray 感谢您的回答,所以是 Thread 类增强了 Callable 的功能?
  • 如果您将(自行实现的)Callable 传递给ExecutorService,通常会得到Future。 JDK中有几个执行器服务实现,你可以看看它们是如何处理的。

标签: java concurrency theory future callable


【解决方案1】:

Java Callable 和 Future 的实现在 JVM 中的什么位置?

Future 接口的主要实现是FutureTask classExecutorService 类使用它来表示提交的作业等。Callable(如Runnable)是您自己实现的简单接口。它包装了您希望ExecutorService 线程池执行的任务。您应该下载这些类的源 jar 并自己查看 Java 代码。

这些类都不包含任何 JVM 黑魔法或任何东西。例如,如果您构造一个Callable 类,除非您将其提交到线程池,否则它不会在另一个线程中运行。您可以在许多与线程无关的地方使用Callable

围绕FutureCallable 的JVM“黑魔法”主要包含在Thread 类中。它具有底层本机支持,可与操作系统线程一起完成在另一个线程中运行任务的实际工作。如果您想看看它的作用,其中仍然有很多 Java 代码,但真正的魔力是原生和操作系统调用。

这是在 1.5 中添加到 Java 中的 good tutorial about how to use the executor services

【讨论】:

  • 没有。 Future 只是一个工作包装器。如果您有一个包含 10 个线程的线程池,您可能会向该线程池 @raffian 提交 100k Future 作业。
【解决方案2】:

Guava 库有自己的Future 实现:AbstractFuture(以及SettableFuture 等子类),这是FutureTask 的替代方案。

如果您有兴趣了解这些事情是如何实现的,这可能也很有趣。通常番石榴代码写得很好。

【讨论】:

    【解决方案3】:

    Future 是一个接口。它本身没有实现,它只是指定方法签名。您可以检查实现此接口的任何类的源代码。与 JVM 捆绑的一些公共类是:

    您可以使用 grepcode 查看它们的实现。

    【讨论】:

    • 这令人困惑。大多数接口都有实现,FutureTask 就是这样一个例子。
    • @Gray 有什么困惑? FutureTask 只是一个例子。其他实现可能会以不同的方式进行并具有不同的逻辑。例如。标准 JVM 库错过了未来的实现,您可以在这里设置值:SettableFuture
    • Future 接口没有实现令人困惑。在同一个包中,有一个并发类使用的实现。也许你想改写?
    • @Gray 啊,是的,这令人困惑。谢谢
    猜你喜欢
    • 2013-02-21
    • 2016-10-12
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多