В этой статье мы рассмотрим наиболее важные методы, доступные в классе Thread.

Класс Thread включает в себя множество полезных методов. Но остановимся только на самых важных. Когда вы пишете многопоточное приложение, в большинстве случаев вам придется использовать некоторые из них. Класс потока включает следующие важные методы:
Thread.currentThread()long getId()int getPriority()Thread.State getState()void interrupt()void join()void run()void setDaemon(boolean on)void setPriority(int newPriority)static void sleep(long millis)void start()static void yield()
Thread.currentThread()
Этот метод доступен в пакете java.lang.Thread. Он используется для возврата ссылки на объект потока, выполняющийся в данный момент. Это статический метод, поэтому он доступен и по имени класса. Тип возвращаемого значения этого метода - Thread, он возвращает ссылку на выполняемый в данный момент объект потока. Это не вызывает никаких исключений.
Результатом будет:
The name of this thread is main The name of this thread is Thread-0 The name of this thread is Thread-1
getId()
Метод java.lang.Thread.getId () возвращает идентификатор этой Thread. Идентификатор потока - это положительное длинное число, сгенерированное при создании этого потока.
Идентификатор потока уникален и остается неизменным в течение всего срока его службы. Когда поток завершается, этот идентификатор потока может использоваться повторно.
Результатом будет:
thread = Thread[Admin Thread,1,main] Name = Admin Thread Id = 21
getPriority() and setPriority()
В многопоточной среде планировщик потоков назначает процессор потоку на основе приоритета потока. Метод getPriority () используется для проверки приоритета потока. Когда мы создаем поток, ему назначается какой-то приоритет. Приоритет потока может быть назначен JVM или программистом явно при создании потока. Чтобы назначить приоритет потоку, нам нужно использовать метод s etPriority () с числом от 1 до 10.
Приоритет потока находится в диапазоне от 1 до 10. По умолчанию приоритет потока равен 5.
Результатом будет:
threadA thread priority : 5 threadB thread priority : 5 running thread name is:Thread-0 running thread name is:Thread-1
getState()
Когда мы выполняем поток, существуют различные состояния для нормального выполнения потока. Чтобы проверить текущее состояние потока, мы можем вызвать метод getState() в этом потоке. Тип возвращаемого значения этого метода - Thread. State, поэтому он возвращает состояние этого потока.
Результатом будет:
The name of this thread is ThreadState The state of this thread is : RUNNABLE
interrupt()
В многопоточном программировании бывают случаи, когда нужно остановить выполнение какого-либо потока - прервать поток. прерывание - это указание потоку, что он должен остановить то, что он делает, и сделать что-то еще. Программист должен решить, как именно поток реагирует на прерывание, но очень часто поток завершается.
Этот метод требует более подробного объяснения, мы рассмотрим его в следующей статье.
join()

Этот метод соединения потока Java переводит текущий поток в режим ожидания, пока поток, из которого он вызван, не станет мертвым. Если поток прерывается, он выдает InterruptedException.
Метод join () также может возвращать, если указанный поток был прерван. В этом случае метод генерирует InterruptedException.
Наконец, если указанный поток уже был завершен или не запущен, вызов метода join () немедленно возвращается.
Результатом будет:
INFO: Thread Created INFO: Invoking join INFO: Thread Thread-1 started INFO: Thread Thread-1 exiting INFO: Returned from join
run() vs start()
Метод run () потока инкапсулирует логику, которая должна выполняться потоком. Но не забывайте вызывать этот метод самостоятельно. Когда мы попытаемся вызвать этот метод, он будет успешно завершен, но проблема в том, что он будет обрабатываться в основном потоке, а не в отдельном. Чтобы он работал должным образом, вам просто нужно переопределить метод запуска с помощью настраиваемой логики. Метод run () будет вызван потоком автоматически, когда он будет запущен.
Создание нового потока: когда программа вызывает метод start (), создается новый поток, а затем выполняется метод run (). . Но если мы напрямую вызовем метод run (), тогда новый поток не будет создан, а метод run () будет выполняться как обычный вызов метода в самом текущем вызывающем потоке. и никакой многопоточности не будет.
Множественные вызовы. В концепции многопоточности Java еще одним наиболее важным различием между методами start () и run () является то, что мы не можем вызовите метод start () дважды, иначе он выдаст исключение IllegalStateException, тогда как метод run () может вызывается несколько раз, поскольку это обычный вызов метода.
setDaemon()
С другой стороны, потоки демона - это потоки с низким приоритетом, единственная роль которых заключается в предоставлении услуг пользовательским потокам. Поскольку потоки демонов предназначены для обслуживания пользовательских потоков и необходимы только во время работы пользовательских потоков, они не препятствуют выходу JVM после того, как все пользовательские потоки завершат свое выполнение.
Чтобы сделать поток потоком демона, все, что нам нужно сделать, это вызвать Thread.setDaemon ():
Метод setDaemon () может быть вызван только после того, как объект Thread был создан и поток не был запущен. Попытка вызвать setDaemon () во время работы потока вызовет исключение IllegalThreadStateException:
sleep()
Thread.sleep() метод может использоваться для приостановки выполнения текущего потока на указанное время в миллисекундах. Значение аргумента для миллисекунд не может быть отрицательным, иначе будет выдано IllegalArgumentException.
yield()
yield() в основном означает, что поток не делает ничего особенно важного, и если необходимо запустить какие-либо другие потоки или процессы, они должны выполняться. В противном случае текущий поток продолжит работу.

Использование метода доходности:
- Каждый раз, когда поток вызывает метод java.lang.Thread.yield, он дает планировщику потока подсказку, что он готов приостановить свое выполнение. Планировщик потоков может проигнорировать эту подсказку.
- Если какой-либо поток выполняет метод yield, планировщик потоков проверяет, есть ли поток с таким же или более высоким приоритетом, чем этот поток. Если процессор находит какой-либо поток с более высоким или таким же приоритетом, он переводит текущий поток в состояние Готов / Выполняется и передает процессор другому потоку, а если нет - текущий поток продолжит выполнение.
Результатом будет:
Thread-0 in control Thread-0 in control Thread-0 in control Thread-0 in control Thread-0 in control main in control main in control main in control main in control main in control
Заключение
В этой статье мы узнали о различных методах потока и о том, когда использовать каждый из них.
В следующей статье мы рассмотрим Как убить ветку. Будьте на связи.
Эта статья оказалась полезной? Подписывайтесь на меня (Дмитрий Тимченко) на Medium и смотрите другие мои статьи ниже! Пожалуйста, поделитесь этой статьей!
Ресурсы:
Параллелизм Java на практике: https://www.oreilly.com/library/view/java-concurrency-in/0321349601/
CurrentThread: https://www.includehelp.com/java/thread-class-static-thread-currentthread-method-with-example.aspx
Приоритет потока: https://www.geeksforgeeks.org/java-thread-priority-multithreading/
запустить против начала: https://javarevisited.blogspot.com/2014/09/common-java-multi-threading-mistakes-1-run-vs-start.html
методы потока: https://www.geeksforgeeks.org/java-concurrency-yield-sleep-and-join-methods/