Семантика 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