Как бегун использовал для запуска Callable в FutureTask <V> - PullRequest
0 голосов
/ 30 сентября 2018

В исходном коде FutureTask<V> есть volatile переменная экземпляра Thread runner, где в комментарии сказано, что это поток, выполняющий вызываемый объект.Однако runner никогда не инициализируется в исходном коде.Более того, я не смог найти никакой подсказки, как этот runner используется для запуска вызываемого.

Вопрос: Поскольку runner никогда не инициализируется, как он используется для запуска Callable?

1 Ответ

0 голосов
/ 30 сентября 2018

В коде вы можете увидеть

if (state != NEW ||
        !UNSAFE.compareAndSwapObject(this, runnerOffset,
                                     null, Thread.currentThread()))

в начале метода run.Игнорирование части state != NEW;это попытается установить переменную runner на результат Thread.currentThread() (и будет успешным, только если она в настоящее время null).Только в случае успеха (возвращает true) метод run сможет пройти через остальную часть кода в этом блоке.И поскольку результатом Thread.currentThread() будет Thread, который вызвал метод run, документация является точной (по крайней мере, после того, как эта начальная if часть успешно оценена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...