Я читал о потоках и обнаружил, что мы не можем дважды вызвать метод start в одном экземпляре потока. Но я не понял точной причины этого. Так почему мы не можем назвать это дважды или даже больше?
Почему мы не можем дважды вызвать метод запуска в одном экземпляре объекта Thread?
Ответ 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 повторно использует этот идентификатор.