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

108
задан Machavity 22 November 2017 в 20:27
поделиться

9 ответов

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

111
ответ дан Paul Croarkin 24 November 2019 в 03:26
поделиться

По крайней мере, в JVM 1.6., существует немного проверки, и выполненный назван исходно:

 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();
        group.add(this);
        start0();
        if (stopBeforeStart) {
        stop0(throwableFromStop);
    }
    }

    private native void start0();
2
ответ дан Steve B. 24 November 2019 в 03:26
поделиться

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

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

3
ответ дан Salman Kasbati 24 November 2019 в 03:26
поделиться

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

3
ответ дан 24 November 2019 в 03:26
поделиться

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

5
ответ дан Brian 24 November 2019 в 03:26
поделиться

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

9
ответ дан Aniket Kulkarni 24 November 2019 в 03:26
поделиться

На это уже сослались, но только быть ясным: создание нового потока возражает только для вызова, оно работало (), метод является напрасно дорогим и должен быть главным красным флагом. Это был бы намного лучший, более разъединенный дизайн для создания Выполнимого impl и любого (a) звоните , это выполнено () метод непосредственно, если это - желаемое поведение, или (b) создайте новый поток с этим Выполнимым и запустите Поток.

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

13
ответ дан Scott Bale 24 November 2019 в 03:26
поделиться

Принятая форма Java Стиля кода распараллеливает FAQ:

Q: каково различие между запуском потока () и выполненный () методы?

А: отдельный запуск () и выполненный () методы в классе Потока обеспечивает два способа создать поточные программы. Запуск () метод запускает выполнение нового потока и называет выполнение () методом. Запуск () метод сразу возвращается, и новый поток обычно продолжается до выполнения () возвраты метода.

выполнение класса Потока () метод ничего не делает, таким образом, подклассы должны переопределить метод с кодом для выполнения во втором потоке. Если Поток инстанцируют с Выполнимым аргументом, выполнение потока (), метод выполняет выполнение () метод Выполнимого объекта в новом потоке вместо этого.

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

27
ответ дан Tomalak 24 November 2019 в 03:26
поделиться

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

94
ответ дан Adam Crume 24 November 2019 в 03:26
поделиться