3

下面是提交作业的一段代码。假设我有 3 个线程正在运行。get 方法如何等待并获取相应的线程结果。

Future<?> result = threadPool.submitTasks(new Callable<T>() {
            public T call() throws Exception {
                // do something
        }

});
anyType = (T) result.get(); 

或者假设我的任务 A 结果为 1,任务 B 结果为 2。当涉及到 get 方法时,它返回正确值的保证是什么?

4

2 回答 2

5

您提交的任务(在本例中为 Callable)被包装到返回的实例中Future。本质上,与创建它Future任务直接相关,而不是任何其他任务。

在内部,当调用 时get,future 将尝试获取与其包装任务共享的锁。获取后,它会查询任务的状态以确定下一步要做什么:

  1. 如果Future被取消,或者底层任务产生异常,则抛出异常
  2. 否则,返回任务生成的结果。

大致是它的工作原理,有几种实现,Future它们都有不同的内部逻辑。

于 2013-03-06T17:11:54.690 回答
0

您假设可以保证他们将收到正确的输出。这是实现线程安全代码的问题。

通常,为了使实现线程安全,您将使用某种标志将其锁定以禁止使用。这将向其他线程表明他们不能使用它。

于 2013-03-06T17:04:08.670 回答