Почему мы не можем вызвать метод start дважды для одного и того же экземпляра объекта Thread? - PullRequest
18 голосов
/ 18 апреля 2010

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

Ответы [ 5 ]

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

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

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

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

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

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

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

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

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

1 голос
/ 17 июля 2017

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

    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: Даже поток готов, мы не можем использовать один и тот же объект (идентификатор потока) второй раз До тех пор, пока JVM не будет повторно использовать этот идентификатор.

1 голос
/ 19 октября 2016

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

Нить можно купить до состояния Работает из состояния Работоспособно не из состояния Мертвое .

1 голос
/ 03 сентября 2015

A Thread - это не то же самое, что нить.

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

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

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

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