В чем разница между Thread.start () и Thread.run ()? - PullRequest
35 голосов
/ 20 апреля 2010

Почему мы вызываем метод start(), который, в свою очередь, вызывает метод run()?
Разве мы не можем позвонить напрямую run()?

Пожалуйста, приведите пример, где есть разница.

Ответы [ 9 ]

42 голосов
/ 20 апреля 2010

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

18 голосов
/ 20 апреля 2010

Почему мы вызываем метод start(), который, в свою очередь, вызывает метод run()?

Нет, это неточно. start() в свою очередь не вызывает метод run. вместо этого он запускает поток, который выполняет метод run. Это родной.

Разве мы не можем напрямую позвонить на run()?

Если вы вызываете run() напрямую, вы не запускаете поток, вы просто выполняете метод для того же метода вызывающего.

Пожалуйста, приведите пример, где есть разница.

В Интернете миллионы. Следовательно, я не дублирую.

4 голосов
/ 30 октября 2012

На самом деле thread.start() создает новый поток и имеет собственный сценарий выполнения.

но thread.run() не создает новый поток, вместо этого он выполняет метод run в текущем запущенном потоке.

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

1 голос
/ 20 апреля 2010

Потому что start () не просто вызывает run (). Он запускает новый поток и в этом потоке вызывает run ().

0 голосов
/ 23 октября 2015

это работа, выполненная методом запуска

synchronized public void start()
{ 
    //it calls start0() method internally and start0() method does below
    //create a real child thread and register with thread scheduler
    //create runtime stack for child thread
    //call run() on underlying Runtime object
}
0 голосов
/ 02 октября 2015

Поскольку start(); синхронизирован, а run(); - простой / обычный метод. То же, что Java знает, начиная выполнение с main(); метода. Как поток знает, начиная выполнение с run();

Вот исходный код от Thread Класс:

run(); код:

@Override
public void run() { // overriding from Runnable
        if (target != null) {
            target.run();
        }
}

start(); код:

public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

Вкратце start(); - это менеджер потоков, как управлять и т. Д., А run(); - это точка начала работы потоков.

0 голосов
/ 03 июня 2014

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

0 голосов
/ 30 мая 2014

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

Большую часть времени вызов run () является ошибкой или ошибкой программирования, поскольку вызывающая сторона намерена вызвать start () для создания новогопоток и эта ошибка может быть обнаружена многими инструментами покрытия статического кода, такими как findbugs.Если вы хотите выполнить трудоемкую задачу, то всегда вызывайте метод start (), иначе ваш основной поток будет зависать при выполнении трудоемкой задачи, если вы вызываете метод run () напрямую.Еще одно отличие между запуском и запуском в потоке Java заключается в том, что нельзя дважды вызывать метод start () для объекта потока.после запуска второй вызов start () вызовет исключение IllegalStateException в Java, в то время как вы можете вызвать метод run () дважды.

0 голосов
/ 20 апреля 2010

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

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