在source code of FutureTask<V>
中,有一个volatile
实例变量 Thread runner
,其中注释表明它是运行可调用对象的线程。但是,runner
从未在源代码中初始化。而且,我找不到任何线索来使用此runner
来运行可调用对象。
问题:由于从未初始化过runner
,因此如何使用它来运行Callable
?
答案 0 :(得分:1)
在代码中您可以看到
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
在run
方法的开头。忽略state != NEW
部分;这会尝试将runner
变量设置为Thread.currentThread()
的结果(并且仅在当前为null
时才会成功)。只有成功(返回true
),run
方法才能遍历此块中的其余代码。并且由于Thread.currentThread()
的结果将是称为Thread
方法的run
,所以文档是准确的(至少在成功评估了此初始if
部分之后)。