Подтвердить что ты не робот

В чем разница между Thread.start() и Thread.run()?

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

Просьба привести пример, где есть разница.

4b9b3361

Ответ 1

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

Ответ 2

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

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

Не можем ли мы сделать прямой вызов run()?

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

Просьба привести пример, где есть разница.

В Интернете есть миллионы. Поэтому я не дублирую.

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

Поскольку 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 list of threads
         * and the group 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(); - точка перекоса в работе потока.

Ответ 9

это работа, выполненная методом start

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
}