Когда бы вы назвали Java thread.run()
вместо thread.start()
?
java
multithreading
concurrency
пустой
источник
источник
t.run()
когда вы хотите запуститьt
задачу в текущем потоке, иt.start()
когда вы хотите запуститьt
задачу вt
самом потоке . Или вы спрашиваете о реальных случаях использования?start()
! Как и я ... Этот метод не должен быть публичным!Ответы:
Вы можете вызвать run () в конкретном модульном тесте, который касается строго функциональности, а не параллелизма.
источник
Никогда. Вызов run () напрямую просто выполняет код синхронно (в том же потоке), как и при обычном вызове метода.
источник
Взято из FAQ по потокам Java в стиле кода :
источник
thread's run() method executes the run() method of the Runnable object in the new thread instead.
Это неправда (или, по крайней мере, мой исходный код Java 8 говорит об обратном), но, к сожалению, ссылка не работает, поэтому я сообщаю об ошибке здесь.thread.run()
вместоthread.start()
.Выполнение
thread.run()
не создает нового,Thread
в котором выполняется ваш код. Он просто выполняет код в текущем потоке, из которого этотthread.run()
код вызывается.Выполнение
thread.start()
создает новый поток уровня ОС, в котором вызываетсяrun()
метод.По сути:
Более того, как отмечали другие, «тестирование», по-видимому, является единственным рекомендуемым случаем, когда вы можете вызывать
run()
непосредственно из своего кода.источник
Об этом уже упоминалось, но для ясности: создание нового объекта Thread только для вызова его метода run () излишне дорого и должно быть серьезным красным флажком. Было бы намного лучше, с большей развязкой создать Runnable impl и либо (а) вызвать его метод run () напрямую, если это желаемое поведение, либо (b) создать новый поток с этим Runnable и запустить поток.
А еще лучше, для еще большей развязки, ознакомьтесь с
Executor
интерфейсом и фреймворком в JDK 5 и новее. Это позволяет вам, в двух словах, отделить выполнение задачи (экземпляр Runnable) от того, как она выполняется (реализация Executor, которая может выполнять Runnable в текущем потоке, в новом потоке, используя существующий поток из пула, и что "нет).источник
Звоните
thread.start()
, он в свою очередь позвонитthread.run()
. Не могу придумать случая, когда вы хотели бы обойтиthread.start()
и перейти прямо кthread.run()
источник
Отдельные
start()
иrun()
методы в классе Thread обеспечивают два способа создания многопоточных программ.start()
Метод начинает выполнение нового потока и вызываетrun()
метод.start()
Метод возвращает немедленно и новый поток обычно продолжается доrun()
возврата метода.Метод класса Thread
run()
ничего не делает, поэтому подклассы должны переопределить метод кодом для выполнения во втором потоке. Если поток создается с аргументом Runnable,run()
методrun()
потока вместо этого выполняет метод объекта Runnable в новом потоке.В зависимости от характера вашей многопоточной программы
run()
прямой вызов метода Thread может дать тот же результат, что и вызов черезstart()
метод, но в последнем случае код фактически выполняется в новом потоке.ссылка
источник
The start() method returns immediately and the new thread normally continues until the run() method returns.
Еслиstart()
немедленно возвращается, почему онrun()
продолжает работать, учитывая, что он был назван сам по себеstart()
Если вопрос был - «почему вызывается метод запуска потока, а не метод запуска напрямую», то я ответил приведенным ниже примером кода. Надеюсь, что это прояснит. В примере ниже:
источник
Когда вы хотите, чтобы он работал синхронно. Вызов метода run на самом деле не даст вам многопоточности. Метод запуска создает новый поток, который вызывает метод запуска.
источник
Если вы хотите выполнить содержимое run (), как и любой другой метод. Конечно, не для того, чтобы начинать нить.
источник
Предполагая, что вы знаете, как используются методы запуска и запуска, т.е. синхронный или асинхронный; Метод run можно использовать только для проверки работоспособности.
Кроме того, в некоторых случаях один и тот же класс потока может использоваться в двух разных местах с требованиями к синхронизирующей и асинхронной функциональности, имея два разных объекта с вызовом одного метода запуска и другого метода запуска.
источник
По крайней мере, в JVM 1.6 есть некоторая проверка и запуск, вызываемый изначально:
источник
Просто примечание к приведенным выше замечательным комментариям: иногда вы пишете многопоточный код, который использует метод «start» для запуска разных потоков. Вам будет намного проще использовать «run» (вместо «start») для отладки, так как это делает код для синхронного запуска и отладки намного проще.
источник
источник