Spec-Zone .ru
спецификации, руководства, описания, API
Содержание | Предыдущий | Следующий | Индекс

20.20 Класс java.lang.Thread

Поток является единственным последовательным потоком управления. Объекты потока позволяют многопоточное программирование Java; единственная виртуальная машина Java может выполнить много потоков чередованным или параллельным способом.

В описаниях метода, которые следуют, очень важно различить среди "текущего потока" (поток, выполняющий метод), "это Thread"(объект, для которого был вызван метод), и "этот поток" (поток, который представляется Thread объект, для которого метод был вызван).


public class Thread implements Runnable {
	public final static int MIN_PRIORITY = 1;
	public final static int MAX_PRIORITY = 10;
	public final static int NORM_PRIORITY = 5;
	public Thread();
	public Thread(String name);
	public Thread(Runnable runObject);
	public Thread(Runnable runObject, String name);
	public Thread(ThreadGroup group, String name)
		throws SecurityException, IllegalThreadStateException;
	public Thread(ThreadGroup group, Runnable runObject)
		throws SecurityException, IllegalThreadStateException;
	public Thread(ThreadGroup group, Runnable runObject,
			String name)
		throws SecurityException, IllegalThreadStateException;
	public String toString();
	public void checkAccess() throws SecurityException;
	public void run();
	public void start()
		throws IllegalThreadStateException;
	public final void stop()
		throws SecurityException;
	public final void stop(Throwable thr)
		throws SecurityException, NullPointerException;
	public final void suspend()
		throws SecurityException;
	public final void resume()
		throws SecurityException;
	public final String getName();
	public final void setName(String name)
		throws SecurityException;
	public final ThreadGroup getThreadGroup();
	public final int getPriority();
	public final void setPriority(int newPriority)
		throws SecurityException, IllegalArgumentException;
	public final boolean isDaemon();
	public final void setDaemon(boolean on)
		throws SecurityException, IllegalThreadStateException;
	public final boolean isAlive();
	public int countStackFrames();
	public final void join()
		throws InterruptedException;
	public final void join(long millis)
		throws InterruptedException;
	public final void join(long millis, int nanos)
		throws InterruptedException;
	public void interrupt();
	public boolean isInterrupted();
	public static boolean interrupted();
	public static Thread currentThread();
	public static int activeCount();															// deprecated
	public static int enumerate(Thread tarray[]);															// deprecated
	public static void dumpStack();
	public static void yield();
	public static void sleep(long millis)
throws InterruptedException; public static void sleep(long millis, int nanos)
throws InterruptedException; public void destroy(); }
Когда новое Thread объект создается, поток, который он представляет, еще не является активным. Это активируется, когда некоторый другой поток вызывает start метод (§20.20.14) Thread объект. Это вызывает поток, представленный Thread объект вызвать run метод (§20.20.13) Thread объект. Недавно активированный поток тогда остается живым, пока он не останавливается, потому что одна из пяти вещей происходит:

Поскольку поток умирает, notifyAll метод (§20.1.10) вызывается для Thread объект, который представляет это; этот факт важен для правильного функционирования join методы (§20.20.28, §20.20.29, §20.20.30). Поток также удаляется из его группы потока, как он умирает. Как только поток был остановлен, это больше не живо, и это не может быть перезапущено.

Поток, который жив, может быть приостановлен и возобновлен. Приостановленный поток, как полагают, жив, но он не выполняет работы, не делает успехов, не выполняет инструкций виртуальной машины. Возобновление восстанавливает поток к состоянию активного выполнения. Поток приостанавливается, когда он или другой поток вызывает suspend метод (§20.20.17) Thread объект, который представляет это (и менеджер безопасности (§20.17.11) одобряет выполнение suspend работа). Поток возобновляется, когда другой поток вызывает resume метод (§20.20.18) Thread объект, который представляет это (и менеджер безопасности (§20.17.11) одобряет выполнение resume работа).

У каждого потока есть приоритет. Когда есть соревнование за обработку ресурсов, потоки с более высоким приоритетом обычно выполняются в предпочтении к потокам с более низким приоритетом. Такое предпочтение не является, однако, гарантией, что самый высокий приоритетный поток будет всегда работать, и распараллеливают приоритеты, не может использоваться, чтобы реализовать взаимное исключение. Когда код, работающий в некотором потоке, создает новое Thread объект, у недавно создаваемого потока есть свой приоритет первоначально набор, равный приоритету потока создания. Но приоритет потока T может быть изменен в любое время, если некоторый поток вызывает setPriority метод Thread объект, который представляет T (и менеджер безопасности (§20.17.11) одобряет выполнение setPriority работа).

Каждый поток может или не может быть отмечен как демон. Когда код, работающий в некотором потоке, создает новое Thread объект, недавно создаваемый поток является потоком демона, если и только если поток создания является демоном. Но daemonhood потока T может быть изменен прежде, чем он будет активирован, если некоторый другой поток вызывает setDaemon метод Thread объект, который представляет T (и менеджер безопасности (§20.17.11) одобряет выполнение setDaemon работа).

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

Есть два способа создать новый поток выполнения. Нужно объявить, что некоторый класс подкласс Thread; этот подкласс должен переопределить run метод класса Thread. Экземпляр подкласса может тогда быть создан и запущен. Например, рассмотрите код для потока, задание которого должно вычислить начала, больше чем установленное значение:


class PrimeThread extends Thread {

long minPrime;
PrimeThread(long minPrime) { this.minPrime = minPrime; }
public void run() { // compute primes larger than minPrime ... }
}
Следующий код тогда создал бы поток и запустил бы его выполнение:


PrimeThread p = new PrimeThread(143);
p.start();
Другой способ создать поток к, должен объявить, что некоторый класс реализует Runnable интерфейс, который также требует, чтобы класс реализовал run метод. Экземпляр класса может тогда быть создан, использоваться, чтобы создать a Thread, и запускался. Тот же самый пример в этом другом стиле похож на это:


class PrimeRun implements Runnable {

long minPrime;
PrimeRun(long minPrime) { this.minPrime = minPrime; }
public void run() { // compute primes larger than minPrime ... }
}
Следующий код тогда создал бы поток и запустил бы его выполнение:


PrimeRun p = new PrimeRun(143);
new Thread(p).start();
У каждого потока есть имя, которое является a String, в целях идентификации. Больше чем у одного потока может быть то же самое имя. Если имя не определяется, когда поток создается, новое имя сгенерировано для этого.

Каждый поток, который еще не был остановлен, принадлежит группе потока (§20.21). Поток может всегда создавать новый поток в своей собственной группе потока. Создать поток в некоторой другой группе потока требует одобрения checkAccess метод (§20.21.4) той группы потока, который вперед решение к менеджеру безопасности (§20.17.11).

20.20.1 public final static int MIN_PRIORITY = 1;

Постоянная величина этого поля 1, наименьший позволенный приоритет для потока.

20.20.2 public final static int MAX_PRIORITY = 10;

Постоянная величина этого поля 10, самый большой позволенный приоритет оценивает за поток.

20.20.3 public final static int NORM_PRIORITY = 5;

Постоянная величина этого поля 5, нормальный приоритет для потока, который не является демоном.

20.20.4 public Thread()

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы это не имело никакого отдельного объекта выполнения, имело недавно сгенерированное имя, и принадлежало той же самой группе потока как поток, который создает новый поток.

Этот конструктор имеет точно тот же самый эффект как явный вызов конструктора this(null, null, gname) (§20.20.10), где gname является недавно сгенерированным именем. Автоматически сгенерированные имена имеют форму "Thread-"+n, где n является целым числом.

20.20.5 public Thread(String name)

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы у этого не было никакого отдельного объекта выполнения, имеет указанное name как его имя, и принадлежит той же самой группе потока как поток, который создает новый поток.

Этот конструктор имеет точно тот же самый эффект как явный вызов конструктора this(null, null, name) (§20.20.10).

20.20.6 public Thread(Runnable runObject)

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы у этого был данный runObject как его отдельный объект выполнения, имеет недавно сгенерированное имя, и принадлежит той же самой группе потока как поток, который создает новый поток.

Этот конструктор имеет точно тот же самый эффект как явный вызов конструктора this(null, runObject, gname) (§20.20.10), где gname является недавно сгенерированным именем. Автоматически сгенерированные имена имеют форму "Thread-"+n, где n является целым числом.

20.20.7 public Thread(Runnable runObject, String name)

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы у этого был данный runObject как его отдельный объект выполнения, имеет указанное name как его имя, и принадлежит той же самой группе потока как поток, который создает новый поток.

Этот конструктор имеет точно тот же самый эффект как явный вызов конструктора this(null, runObject, name) (§20.20.10).

20.20.8 public Thread(ThreadGroup group, String name)
throws SecurityException, IllegalThreadStateException

Во-первых, если группа не null, checkAccess метод (§20.21.4) той группы потока вызывают без параметров.

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы у этого не было никакого отдельного объекта выполнения, имеет указанное name как его имя, и принадлежит группе потока, упомянутой group (но если group null, тогда новый поток будет принадлежать той же самой группе потока как поток, который создает новый поток).

Если group a ThreadGroup это было уничтожено методом destroy (§20.21.11), затем IllegalThreadStateException бросается.

Этот конструктор имеет точно тот же самый эффект как явный вызов конструктора Thread(group, null, name) (§20.20.10).

20.20.9 public Thread(ThreadGroup group, Runnable runObject)
throws SecurityException, IllegalThreadStateException

Во-первых, если группа не null, checkAccess метод (§20.21.4) той группы потока вызывают без параметров.

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы у этого был данный runObject как его отдельный объект выполнения, имеет недавно сгенерированное имя, и принадлежит группе потока, упомянутой group (но если group null, тогда новый поток будет принадлежать той же самой группе потока как поток, который создает новый поток).

Если group a ThreadGroup это было уничтожено методом destroy (§20.21.11), затем IllegalThreadStateException бросается.

Этот конструктор имеет точно тот же самый эффект как явный вызов конструктора this(group, runObject, gname) (§20.20.10), где gname является недавно сгенерированным именем. Автоматически сгенерированные имена имеют форму "Thread-"+n, где n является целым числом.

20.20.10 public Thread(ThreadGroup group, Runnable runObject,
String name)
throws SecurityException, IllegalThreadStateException

Во-первых, если группа не null, checkAccess метод (§20.21.4) той группы потока вызывают без параметров; это может привести к a SecurityException быть брошенным.

Этот конструктор инициализирует недавно создаваемый Thread возразите так, чтобы у этого был данный runObject как его отдельный объект выполнения, имеет указанное name как его имя, и принадлежит группе потока, упомянутой group (но если group null, тогда новый поток будет принадлежать той же самой группе потока как поток, который создает новый поток).

Если group a ThreadGroup это было уничтожено методом destroy (§20.21.11), затем IllegalThreadStateException бросается.

Приоритет недавно создаваемого потока устанавливается равный приоритету потока создания - то есть, в настоящий момент рабочего потока. Метод setPriority (§20.20.23) может использоваться, чтобы изменить приоритет на новое значение.

Недавно создаваемый поток первоначально отмечается как являющийся потоком демона, если и только если поток, создающий его, является потоком демона. Метод setDaemon (§20.20.25) может использоваться, чтобы измениться, является ли поток демоном.

20.20.11 public String toString()

Возвращенное значение является связью следующих семи строк:

Все литеральные упомянутые выше символы от подмножества ACSII Unicode.

Переопределения toString метод Object (§20.1.3).

20.20.12 public void checkAccess() throws SecurityException

Если есть менеджер безопасности, checkAccess метод (§20.17.11) вызывают с этим Thread возразите как его параметр. Это может привести к a SecurityException будучи брошенным в текущий поток.

Этот метод вызывают методы stop ни из каких параметров (§20.20.15), stop из одного параметра (§20.20.16), suspend (§20.20.17), resume (§20.20.18), setName (§20.20.20), setPriority (§20.20.23), и setDaemon (§20.20.25).

20.20.13 public void run()

Общий контракт этого метода - то, что он должен выполнить намеченное действие потока.

run метод класса Thread просто вызовы run метод отдельного объекта выполнения, если есть тот; иначе, это ничего не делает.

20.20.14 public void start()
throws IllegalThreadStateException

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

20.20.15 public final void stop()
throws SecurityException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Этот поток вынуждается завершиться неправильно независимо от того, что он делал и бросить a ThreadDeath возразите как исключение. С этой целью этот поток возобновляется, если он был приостановлен, и пробуждается, если это спало.

Разрешается остановить поток, который еще не был запущен. Если поток будет в конечном счете запущен, то он сразу завершится.

Пользовательский код не должен обычно пытаться поймать ThreadDeath если некоторая экстраординарная работа уборки не необходима (отметьте что процесс броска a ThreadDeath исключение вызовет finally пункты try операторы, которые будут выполнены перед потоком официально, умирают). Если a catch пункт действительно ловит a ThreadDeath объект, важно повторно бросить объект так, чтобы поток фактически умер. Высокоуровневый обработчик ошибок, который реагирует на иначе непойманные исключения, не будет печатать сообщение или иначе сигнализировать или уведомлять пользователя, если непойманное исключение будет экземпляром ThreadDeath.

20.20.16 public final void stop(Throwable thr)
throws SecurityException, NullPointerException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Если параметр thr нуль, тогда a NullPointerException бросается (в текущем потоке).

Этот поток вынуждается завершиться неправильно независимо от того, что он делал и бросить Throwable объект thr как исключение. С этой целью этот поток возобновляется, если он был приостановлен, и пробуждается, если это спало. Это - необычное действие, чтобы взять; обычно, stop метод, который не берет параметров (§20.20.15), должен использоваться.

Разрешается остановить поток, который еще не был запущен. Если поток будет в конечном счете запущен, то он сразу завершится.

20.20.17 public final void suspend()
throws SecurityException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Если этот поток жив (§20.20.26), он приостанавливается и не делает дальнейших успехов, только после того как он возобновляется. Разрешается приостановить поток, который уже находится в состоянии ожидания; это остается приостановленным. Приостановкам не соответствуют; даже если поток приостанавливается не раз, только один звонок resume обязан возобновлять это.

20.20.18 public final void resume()
throws SecurityException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Если этот поток жив (§20.20.26), но приостановленный, это возобновляется и разрешается сделать успехи в его выполнении. Разрешается возобновить поток, который никогда не приостанавливался или был уже возобновлен; это продолжает делать успехи в его выполнении. Возобновлению не соответствуют; даже если поток возобновляется не раз, только один звонок suspend обязан приостанавливать это.

20.20.19 public final String getName()

Текущее имя этого Thread объект возвращается как a String.

20.20.20 public final void setName(String name)
throws SecurityException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Имя этого Thread объект изменяется, чтобы быть равным параметру name.

20.20.21 public final ThreadGroup getThreadGroup()

Если этот поток жив, этот метод возвращает ссылку на ThreadGroup объект, который представляет группу потока, которой принадлежит этот поток. Если этот поток умер (был остановлен), этот метод возвраты null.

20.20.22 public final int getPriority()

Текущий приоритет этого Thread объект возвращается.

20.20.23 public final void setPriority(int newPriority)
throws SecurityException, IllegalArgumentException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Если newPriority параметром являются меньше чем MIN_PRIORITY (§20.20.1) или больше чем MAX_PRIORITY (§20.20.2), затем IllegalArgumentException бросается.

Иначе, приоритет этого Thread объект устанавливается в меньшие из указанных newPriority и максимальный разрешенный приоритет (§20.21.12) группы потока потока (§20.20.21).

20.20.24 public final boolean isDaemon()

Результат true если и только если этот поток отмечается как поток демона.

20.20.25 public final void setDaemon(boolean on)
throws SecurityException, IllegalThreadStateException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Если этот поток жив, IllegalThreadStateException бросается. Иначе, этот поток отмечается как являющийся потоком демона, если параметр true, и как не являющийся демоном распараллеливают, если параметр false.

20.20.26 public final boolean isAlive()

Результат true если и только если этот поток жив (он был запущен и еще не умер).

20.20.27 public int countStackFrames()

Этот метод возвращает число стековых фреймов виртуальной машины Java, в настоящий момент активных для этого потока.

20.20.28 public final void join() throws InterruptedException

Этот метод заставляет текущий поток ожидать (использование wait метод (§20.1.6) класса Object) пока этот поток больше не жив.

Если текущий поток прерывается (§20.20.31) другим потоком, в то время как это ожидает, то ожидание заканчивается и InterruptedException бросается.

20.20.29 public final void join(long millis)
throws InterruptedException

Этот метод заставляет текущий поток ожидать (использование wait метод (§20.1.7) класса Object) или до этот поток больше не жив или до определенное количество реального времени, протек, более или менее.

Количеством реального времени, измеренного в миллисекундах, дают millis. Если millis нуль, однако, тогда реальное время не учитывается, и этот метод просто ожидает, пока этот поток больше не жив.

Если текущий поток прерывается (§20.20.31) другим потоком, в то время как это ожидает, то ожидание заканчивается и InterruptedException бросается.

20.20.30 public final void join(long millis, int nanos)
throws InterruptedException

Этот метод заставляет текущий поток ожидать (использование wait метод (§20.1.8) класса Object) или до этот поток больше не жив или до определенное количество реального времени, протек, более или менее.

Количеством реального времени, измеренного в наносекундах, дают:

1000000*millis+nanos
Во всех других отношениях этот метод делает ту же самую вещь как метод join из одного параметра (§20.20.29). В частности join(0, 0) означает ту же самую вещь как join(0).

Если текущий поток прерывается (§20.20.31) другим потоком, в то время как это ожидает, то ожидание заканчивается и InterruptedException бросается.

20.20.31 public void interrupt()

Запрос на прерывание отправляется для этого потока. Этот поток не обязательно сразу реагирует на прерывание, как бы то ни было. Если этот поток ожидает, он пробуждается, и он тогда бросает InterruptedException.

[Этот метод планируется для введения в версии 1.1 Java.]

20.20.32 public boolean isInterrupted()

Результат true если и только если запрос на прерывание был отправлен для этого потока.

[Этот метод планируется для введения в версии 1.1 Java.]

20.20.33 public static boolean interrupted()

Результат true если и только если запрос на прерывание был отправлен для текущего потока.

[Этот метод планируется для введения в версии 1.1 Java.]

20.20.34 public static Thread currentThread()

Thread объект, который представляет текущий поток, возвращается.

20.20.35 public static int activeCount()

Этот метод возвращает число активных потоков в группе потока, которой принадлежит текущий поток. Это количество включает потоки в подгруппы той группы потока. Это - то же самое как значение выражения:

Threads.currentThread().getThreadGroup().activeCount()
[Этот метод осуждается для использования в новом коде после того, как версия 1.1 Java становится доступной. Вместо этого выражение, эквивалентное:

Threads.currentThread().getThreadGroup().allThreadsCount()
должен использоваться. См. метод allThreadsCount из класса ThreadGroup.]

20.20.36 public static int enumerate(Thread tarray[])

Активные потоки в группе потока, которой текущий поток принадлежит, включая потоки в подгруппах той группы потока, перечисляются, и их объекты Потока помещаются в массив tarray. Число потоков, фактически помещенных в массив, возвращается. Вызовите это значение n; тогда потоки были помещены в элементы 0 через n-1 из tarray. Если число потоков превышает длину tarray, тогда некоторые из потоков, tarray.length из них, выбираются произвольно и используются, чтобы заполнить массив tarray.

[Этот метод осуждается для использования в новом коде после того, как версия 1.1 Java становится доступной. Вместо этого выражение, эквивалентное:

Threads.currentThread().getThreadGroup().allThreads()
должен использоваться. См. метод allThreads из класса ThreadGroup.]

20.20.37 public static void dumpStack()

Это - служебный метод, который облегчает печатать дамп стека для текущего потока. Это эквивалентно в действительности:

new Exception("Stack trace").printStackTrace()
См. printStackTrace метод (§20.22.6) класса Throwable.

20.20.38 public static void yield()

Этот метод заставляет текущий поток уступать, позволяя планировщика потока выбрать другой выполнимый поток для выполнения.

20.20.39 public static void sleep(long millis)
throws InterruptedException

Этот метод заставляет текущий поток уступать а не планироваться для дальнейшего выполнения, пока определенное количество реального времени не протекло, более или менее.

Количеством реального времени, измеренного в миллисекундах, дают millis.

Если текущий поток прерывается (§20.20.31) другим потоком, в то время как это ожидает, то сон заканчивается и InterruptedException бросается.

20.20.40 public static void sleep(long millis, int nanos)
throws InterruptedException

Этот метод заставляет текущий поток уступать а не планироваться для дальнейшего выполнения, пока определенное количество реального времени не протекло, более или менее.

Количеством реального времени, измеренного в наносекундах, дают:

1000000*millis+nanos
Во всех других отношениях этот метод делает ту же самую вещь как метод sleep из одного параметра (§20.20.39). В частности sleep(0, 0) означает ту же самую вещь как sleep(0).

Если текущий поток прерывается (§20.20.31) другим потоком, в то время как это ожидает, то сон заканчивается и InterruptedException бросается.

20.20.41 public void destroy()
throws SecurityException

Во-первых, checkAccess метод (§20.20.12) этого Thread объект вызывают без параметров. Это может привести к броску a SecurityException (в текущем потоке).

Затем уничтожает этот поток, без любой уборки. Любые мониторы, которые заблокировал поток, остаются заблокированными.

[Этот метод не реализуется в ранних версиях Java, до 1.1.]


Содержание | Предыдущий | Следующий | Индекс

Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com

free hit counter