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

Почему мы не можем дважды вызвать метод запуска в одном экземпляре объекта Thread?

Я читал о потоках и обнаружил, что мы не можем дважды вызвать метод start в одном экземпляре потока. Но я не понял точной причины этого. Так почему мы не можем назвать это дважды или даже больше?

4b9b3361

Ответ 1

По-моему, объект Thread является вашим "дескриптором" для реального контекста работы. Если вы разрешаете создавать множество параллельных исполнений, связанных с одним и тем же java.lang.Thread, что вы ожидаете от методов getStackTrace() и getState() для возврата?

Я полагаю, что класс Thread мог быть спроектирован так, чтобы разрешить создание множества запущенных контекстов, но его API был бы менее простым и чистым.

Ответ 2

Вы хотите 1 экземпляр для 1 потока, поскольку этот поток имеет внутреннее состояние, которым он будет управлять.

Рассмотрим потоки как своего рода ресурс. Обычно не имеет смысла, чтобы 1 экземпляр ссылался на несколько ресурсов - (так же, как вы не можете иметь объект Java файла для более чем одного файла).

Это также вызовет вас во всех неприятностях, если вы дважды начнете поток, и вы либо унаследовали от Thread, либо сделали некоторые переменные экземпляра, которые теперь имеют более одного потока доступа, - то же самое, если вы создаете поток из a Runnable. По крайней мере, API не создает проблем, связанных с этим.

Взгляните на состояния, в которые может быть поток, здесь http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html

В принципе, единственный раз, когда вы можете начать поток, это когда он находится в состоянии NEW. И ни одно из других состояний не может вернуться к NEW

Ответ 3

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

Thread можно купить в Запуск из состояния Runnable, но не из состояния Мертвое.

Ответ 4

A Thread - это не то же самое, что поток.

A (little-t) thread - это независимое выполнение вашего кода. A (Big-T) Thread - это объект Java, который можно использовать для запуска и управления жизненным циклом потока little-t.

Предположим, что вы были наняты для написания кода для страховой компании, и вы определили класс (большой-A) Accident для представления (маленького-а) несчастного случая. Кто-то спрашивает вас: "Почему я не могу повторно использовать экземпляр Accident?"

Ну, авария может произойти только один раз, верно? Даже если то же самое происходит с одними и теми же драйверами и автомобилями точно так же в другой день, это все равно другая авария, верно?

Ответ 5

Это мое мнение, оно связано с идентификатором потока. Планировщик потоков идентифицирует поток через идентификатор потока. Это единственное действительное число. Ниже приведен код,

    public class StartTwice extends Thread {

    public void run() {
        System.out.println("running...");
    }

    public static void main(String[] args) {

        StartTwice start1 = new StartTwice();
        System.out.println("Thread id: " + start1.getId());
        start1.start();

        start1 = new StartTwice();
        System.out.println("Thread id: " + start1.getId());
        start1.start();
    }

}

Output is:

Thread id: 10
Thread id: 11
running...
running...

Когда я повторно создаю объект start1. Создается новый идентификатор потока.

PS: Даже поток выполнен, мы не можем использовать один и тот же объект (thread id) второй раз.  До или если JVM повторно использует этот идентификатор.