кодесурса

Методы потоков Java и состояния потоков

script1adsense2code
script1adsense3code

Вступление

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

Подпись метода Описание
Строка getName () Получает имя запущенного потока в текущем контексте в формате String.
void start () Этот метод запускает новый поток выполнения, вызывая метод run () объекта Thread / runnable.
void run () Этот метод является точкой входа в поток. Выполнение потока начинается с этого метода.
Пустой сон (int sleeptime) Этот метод приостанавливает поток на указанное время в аргументе (время сна в мс)
void yield () Вызывая этот метод, текущий поток временно приостанавливает выполнение и разрешает выполнение другим потокам.
void join () Этот метод используется для постановки в очередь потока. После вызова в потоке текущий поток будет ждать, пока вызывающий поток завершит свое выполнение
логическое isAlive () Этот метод проверяет, жив поток или мертв

Состояния потоков

Задача планировщика потоков состоит в том, чтобы перемещать потоки в состояние термообработки и из него. Хотя планировщик потока может переместить поток из состояния выполнения обратно в работоспособное состояние, другие факторы могут привести к тому, что поток выйдет из строя, но не вернется в работоспособное состояние. Один из них - когда метод run () потока завершается, и в этом случае поток переходит из состояния выполнения непосредственно в мертвое состояние.


Новый старт:

Это состояние, в котором находится поток после создания экземпляра Thread, но метод start () не был вызван для потока. Это живой объект Thread, но еще не поток выполнения. На данный момент поток считается не живым.

Runnable:

Это означает, что поток может быть запущен, когда механизм временной синхронизации имеет циклы ЦП, доступные для потока. Таким образом, поток может работать или не выполняться в любой момент, но ничто не мешает ему запускаться, если планировщик может это организовать. То есть он не мертв или заблокирован.

Бег:

Это состояние является важным состоянием, в котором происходит действие. Это состояние, в котором находится поток, когда планировщик потока выбирает его (из пула работоспособности), чтобы он выполнял текущий процесс. Поток может выйти из рабочего состояния по нескольким причинам, в том числе потому, что «планировщик потока чувствовал, что это так». Существует несколько способов перехода в состояние выполнения, но только один способ перехода в состояние выполнения: планировщик выбирает поток из пула запуска.

Заблокировано:

Поток можно запустить, но что-то мешает. Пока поток находится в заблокированном состоянии, планировщик просто пропустит его и не выделит ему времени ЦП. До тех пор, пока поток не войдет в состояние выполнения, он не будет выполнять никаких операций. Заблокированное состояние имеет несколько подсостояний, как показано ниже,

  • Заблокировано при вводе / выводе: поток ожидает завершения операции блокировки. Поток может войти в это состояние из-за ожидания ресурса ввода-вывода. В этом случае поток отправляет обратно в работоспособное состояние после доступности ресурсов.
  • Заблокирован для завершения соединения: поток может прийти в это состояние из-за ожидания завершения другого потока.
  • Заблокирован для получения блокировки: поток может прийти в это состояние из-за ожидания получения блокировки объекта.

Мертв:

Поток в мертвом или завершенном состоянии больше не может планироваться и не будет получать никакого времени ЦП. Его задача выполнена, и он больше не работает. Один из способов умереть задачу - вернуться из метода run (), но поток задачи также может быть прерван, как вы вскоре увидите.

Давайте возьмем пример Java-программы для демонстрации различных состояний потока и методов класса потока.

Java-код (AnimalRunnable.java)

package threadstates;
public class AnimalRunnable implements Runnable {
	@Override
	public void run() {
		for (int x = 1; x < 4; x++) {
			System.out.println("Run by " + Thread.currentThread().getName());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
		System.out.println("Thread State of: "+ Thread.currentThread().getName()+ " - "+Thread.currentThread().getState());
		System.out.println("Exit of Thread: "
				+ Thread.currentThread().getName());
	}
}

Код Java (AnimalMultiThreadDemo.java): перейти в редактор

public class AnimalMultiThreadDemo {
	public static void main(String[] args) throws Exception{
		// Make object of  Runnable
		AnimalRunnable anr = new AnimalRunnable();
		Thread cat = new Thread(anr);
		cat.setName("Cat");
		Thread dog = new Thread(anr);
		dog.setName("Dog");
		Thread cow = new Thread(anr);
		cow.setName("Cow");
		System.out.println("Thread State of Cat before calling start: "+cat.getState());
		cat.start();
		dog.start();
		cow.start();
		System.out.println("Thread State of Cat in Main method before Sleep: " + cat.getState());
		System.out.println("Thread State of Dog in Main method before Sleep: " + dog.getState());
		System.out.println("Thread State of Cow in Main method before Sleep: " + cow.getState());
		Thread.sleep(10000);
		System.out.println("Thread State of Cat in Main method after sleep: " + cat.getState());
		System.out.println("Thread State of Dog in Main method after sleep: " + dog.getState());
		System.out.println("Thread State of Cow in Main method after sleep: " + cow.getState());		
	}
}
class AnimalRunnable implements Runnable {
	@Override
	public void run() {
		for (int x = 1; x < 4; x++) {
			System.out.println("Run by " + Thread.currentThread().getName());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException ex) {
				ex.printStackTrace();
			}
		}
		System.out.println("Thread State of: "+ Thread.currentThread().getName()+ " - "+Thread.currentThread().getState());
		System.out.println("Exit of Thread: "
				+ Thread.currentThread().getName());
	}
}

Выход:


Резюме:

  • Как только новый поток запущен, он всегда будет в состоянии выполнения.
  • Планировщик потока может перемещать поток назад и вперед между состоянием выполнения и состоянием выполнения.
  • Для типичной однопроцессорной машины одновременно может быть запущен только один поток, хотя многие потоки могут находиться в состоянии выполнения.
  • Нет никакой гарантии, что порядок, в котором были запущены потоки, определяет порядок, в котором они будут работать. Нет никакой гарантии, что потоки будут чередоваться по-честному. Это зависит от планировщика потоков, который определяется конкретной реализацией виртуальной машины.
  • Работающий поток может войти в заблокированное / ожидающее состояние с помощью вызовов wait (), sleep () или join ().

Редактор кода Java:

Предыдущий: Java Определение, создание и запуск потока
Далее: Взаимодействие Java-потоков

Новый контент: Composer: менеджер зависимостей для PHP , R программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code