Семантика Thread.currentThread() в многоядерных / многопроцессорных системах?

Если работает на многоядерном или многопроцессорном компьютере, где jvm может запускать более одного потока абсолютно одновременно (а не только одновременно), что делает метод API java.lang.Thread.currentThread() return?.... в приведенном выше сценарии, он просто возвращает один из текущих потоков в случайном порядке?

6 ответов

Решение

Возвращает поток, внутри которого вы сейчас работаете. Если у вас есть два ядра и два потока A а также B выполняется полностью одновременно, вызывая этот метод одновременно, он вернет A а также B соответственно.

Ваше понимание в некотором роде правильное - поток, возвращаемый этим методом, всегда работает - потому что он должен быть вызван из какого-то потока, и для возврата он должен быть запущен. Не думайте об этом методе в терминах: "все текущие, не приостановленные, неблокированные потоки". Вместо этого его значение: "дай мне ссылку на поток, который запускает меня".

Это имеет смысл. Он возвращает ссылку на поток, который выполняет код вызова.

Итак, предположим, что у вас есть две темы, threadA а также threadB, Если код работает в threadA звонки currentThread(), затем threadA будет возвращен. Аналогично, если код работает в threadB звонки currentThread(), затем threadB возвращается

Документация довольно слабая, на мой взгляд. Говорится:

Возвращает ссылку на текущий выполняющийся объект потока.

Использование "в настоящее время" здесь очень плохо. В настоящее время часто интерпретируется как "в данный момент времени". Что вас смутило.

По иронии судьбы документация MSDN (!) Делает это лучше:

Получает Thread объект, который вызывает текущий блок кода.

Но они все равно попадают в ловушку использования "тока". О, подводные камни написания технической документации!

jvm has the potential to run more than one thread absolutely simultaneously

Да, это правда. В многоядерной / многопроцессорной системе возможно иметь несколько работающих в данный момент потоков. В JVM работают несколько фоновых потоков, которые есть в каждой системе даже в single processor Система также.

Цель метода java.lang.Thread.currentThread() должен вернуть объект Thread, который выполняет текущий код, который вызывает метод.

java.lang.Thread.currentThread() возвращает поток, в котором выполняется метод, содержащий ваш код.

Это вовсе не означает, что другие потоки не работают одновременно.

Если вы хотите увидеть разницу, вы можете перебрать все текущие потоки с этим фрагментом кода:

for (Thread t : Thread.getAllStackTraces().keySet()) {
    if (t.getState()==Thread.State.RUNNABLE) {
          // see !
    }
}

(или просто посчитать их)

метод api java.lang.Thread.currentThread(), возвращающий только один поток, больше не имеет смысла

Это имеет смысл, только если у вас есть несколько потоков. Возвращает поток, в данный момент выполняющий код. То, что вы не можете получить другим способом.

Возвращает ссылку на текущий выполняющийся объект потока.

См. http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html

Другие вопросы по тегам