В большинстве из этих ответов отсутствует общая картина: между языком t.start()
и r.run()
разницы между *1001* и *1002* нет больше, чем между любыми двумя другими методами.
Они оба просто методы. Они оба запускают в потоке, который назвал их . Они оба делают то, что им было закодировано, и затем оба возвращаются, все еще в том же потоке, к своим вызывающим абонентам.
Самым большим отличием является то, что большая часть кода для t.start()
является нативным кодом, в то время как в большинстве случаев код для r.run()
будет чисто Java. Но это не большая разница. Код есть код. Родной код труднее найти, и труднее понять, когда вы его найдете, но он все еще просто код, который говорит компьютеру, что делать.
Итак, что делает t.start()
? 1016 *
Создает новый собственный поток, организует, чтобы этот поток вызывал t.run()
, а затем сообщает ОС, чтобы новый поток работал. Затем он возвращается.
А что делает r.run()
? 1022 *
Самое смешное, что тот, кто задает этот вопрос, - тот, кто написал . r.run()
делает то, что вы (т. Е. Разработчик, написавший это) разработали.
t.start()
- это метод, который библиотека предоставляет для вызова вашего кода, когда вы хотите создать новый поток.
r.run()
- это метод, который вы предоставляют для библиотеки для вызова в новой нити.