Когда бы вы вызвали java's thread.run () вместо thread.start ()? - PullRequest
107 голосов
/ 04 ноября 2008

Когда бы вы назвали Java thread.run() вместо thread.start()?

Ответы [ 14 ]

110 голосов
/ 04 ноября 2008

Возможно, вы захотите вызвать run () в конкретном модульном тесте, который связан исключительно с функциональностью, а не с параллелизмом.

94 голосов
/ 04 ноября 2008

Никогда. Вызов run () напрямую выполняет код синхронно (в том же потоке), как обычный вызов метода.

27 голосов
/ 04 ноября 2008

Взятые с FAQ по стилю кода Часто задаваемые вопросы :

В: Какая разница между методы start () и run () потока?

A: Отдельные методы start () и run () в классе Thread обеспечивают два способа создания многопоточных программ. Метод start () запускает выполнение нового потока и вызовов метод run (). Метод start () немедленно возвращается и новый поток обычно продолжается до запуска () метод возвращает.

Метод run () класса Thread ничего не делает, поэтому подклассы должны переопределить метод кодом выполнить во втором потоке. Если Поток создается с помощью Runnable аргумент, метод run () потока выполняет метод run () Запускаемый объект в новом потоке вместо этого.

В зависимости от характера вашей многопоточной программы, вызывая поток Метод run () напрямую может дать тот же вывод, что и при вызове через start () метод, но в последнем случае код на самом деле выполняется в новом нить.

23 голосов
/ 21 мая 2012

Выполнение thread.run() не создает новый Thread, в котором выполняется ваш код. Он просто выполняет код в текущем потоке, из которого вызывается код thread.run().

Выполнение thread.start() создает новый поток уровня ОС, в котором вызывается метод run().

По существу:

Однопотоковое программирование → Прямой вызов метода run()

Многопоточное программирование → Вызов метода start()

Более того, как уже упоминалось, «тестирование» является единственным рекомендуемым случаем, когда вы можете вызывать run() непосредственно из своего кода.

13 голосов
/ 04 ноября 2008

Это уже упоминалось, но для ясности: создание нового объекта Thread только для вызова его метода run () неоправданно дорого и должно быть основным красным флагом. Было бы намного лучше, более разъединенным дизайном создать Impn Runnable и либо (a) вызвать метод run () напрямую, если это желаемое поведение, либо (b) создать новый поток с этим Runnable и начните тему.

Еще лучше, для еще большей развязки, ознакомьтесь с интерфейсом и фреймворком Executor в JDK 5 и новее. Это позволяет вам в двух словах отделить выполнение задачи (экземпляр Runnable) от как выполняется (реализация Executor, которая может выполнить Runnable в текущем потоке, в новом потоке, используя существующий поток из пула и еще много чего).

9 голосов
/ 25 августа 2011

Отдельные методы start() и run() в классе Thread предоставляют два способа создания многопоточных программ. Метод start() запускает выполнение нового потока и вызывает метод run(). Метод start() немедленно возвращается, и новый поток обычно продолжается до тех пор, пока не вернется метод run().

Метод класса Thread ’run() ничего не делает, поэтому подклассы должны переопределить метод кодом, выполняемым во втором потоке. Если поток создается с аргументом Runnable, метод run() потока выполняет вместо этого метод run() объекта Runnable в новом потоке.

В зависимости от характера вашей многопоточной программы, непосредственный вызов метода Thread run() может дать тот же результат, что и вызов через метод start(), но в последнем случае код фактически выполняется в новом потоке.

ссылка

9 голосов
/ 04 ноября 2008

Позвоните thread.start(), он, в свою очередь, позвонит thread.run(). Не могу вспомнить случай, когда вы хотели бы обойти thread.start() и перейти непосредственно к thread.run()

7 голосов
/ 16 октября 2011

Если вопрос был - «почему метод запуска потока вызывается вместо метода run напрямую», тогда я ответил с примером кода ниже. Надеюсь, что это проясняет. В приведенном ниже примере:

/*
By calling t1.start(), 
we are getting the main calling thread returned immediately 
after the t1.start() called and is ready to proceed for other 
operations.And the thread t1 starts executing the run method of the object r. 
Hence the the output will be:

      I am the main thread , i created thread t1 and had it execute run method, which is currently looping from 0 to 1000000

      I am done executing run method of testThread

*/


/* If we call t1.run() instead of t1.start(), (just replace t1.start() with t1.run() in the code for testing)
 its like a regular method call and the main thread will not return until the run method completes, 
 hence the output will be:

         I am done executing run method of testThread

         I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000

*/


class testThread implements Runnable{

 public void run()
 {
     for(int i=0;i<1000000;i++){} //a simple delay block to clarify.

     System.out.println("I am done executing run method of testThread");

 }  
}

public class mainClass{

   public static void main(String [] args)
    {
          testThread r = new testThread();
          Thread t1 = new Thread(r);
          t1.start();  /* Question is: can we call instead t1.run() */  
          System.out.println("I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000");

    }
}
5 голосов
/ 04 ноября 2008

Когда вы хотите, чтобы он работал синхронно. Вызов метода run не даст многопоточности. Метод start создает новый поток, который вызывает метод run.

3 голосов
/ 04 ноября 2008

Предполагая, что вы знаете использование метода запуска и запуска, то есть синхронный или асинхронный; Метод run можно использовать только для проверки функциональности.

Кроме того, в некоторых случаях один и тот же класс потока может использоваться в двух разных местах с требованиями к функциональности синхронизации и асинхронности, поскольку для него вызывается два разных объекта с одним методом run и другим методом start.

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