В этой статье следует предыдущая статья «Подробное объяснение примеров многопоточного чтения Java (i)».
4. Управление состоянием блокировки и резьбы многопоточных чтений Java
Несколько конкретных типов блокировки Java были упомянуты выше. Давайте посмотрим на основные методы, которые вызывают блокировку потока Java.
1.join ()
Присоединяйтесь - пусть один поток подожжет еще один поток, прежде чем продолжить выполнение. Если поток A вызывается в методе join -in join () потока B в корпусе выполнения потока, поток A блокируется, и только после того, как из, известно, в потоке B выполнен выполнение потока B, A может продолжать выполнять.
public Class Threadtest {public static void main (string [] args) {myrunnable myrunnable = new myrunnable (); Thread Think = новый поток (myrunnable); for (int i = 0; i <100; i ++) {System.out.println (thread.currentThread (). getName () + "" + i); if (i == 30) {think.start (); try {thread.join (); // Основной поток должен ждать, пока поток поток будет выполнен, прежде чем продолжать выполнять} CATCH (прерывание Exception e) {e.printstackTrace (); }}}}}}}}}}}}}}}}}}}}}}}}2.sleep ()
Сон - пусть в настоящее время выполняется потоковая тема приостановить указанное время и введите состояние блокировки. В течение периода времени он спит, поток не получит возможности выполнить, потому что его не в состоянии готового состояния. Даже если в настоящее время в системе нет других исполняемых потоков, потоки в Sleep () не будут выполняться. Следовательно, метод Sleep () часто используется для приостановки выполнения потока.
Как упоминалось ранее, когда называется метод start () в недавно созданном потоке, поток входит в состояние готового состояния и может получить срез времени процессора для какое -то время для выполнения. Если вы хотите, чтобы новый поток немедленно выполнялся с определенной необходимостью, просто вызовите сон (1) оригинального потока непосредственно.
public Class Threadtest {public static void main (string [] args) {myrunnable myrunnable = new myrunnable (); Thread Think = новый поток (myrunnable); for (int i = 0; i <100; i ++) {System.out.println (thread.currentThread (). getName () + "" + i); if (i == 30) {think.start (); try {thread.sleep (1); // Сделайте поток наверняка быть выполненным немедленно} Catch (прерывание Exception e) {e.printstackTrace (); }}}}}}}}}}}}}}}}}}}}}}}}Примечание: достаточно за один миллисекунд, потому что ЦП не будет простоя и переключится на недавно созданный поток.
3. Фоновая нить (поток демон)
Концепция/Цель: Фоновые потоки в основном предоставляют услуги другим потокам (относительно называемым потоками переднего плана) или «потоками демона». Такие как нить сбора мусора в JVM.
Жизненный цикл: жизненный цикл фонового потока связан с жизненным циклом нити переднего плана. В основном это отражено: когда все потоки переднего плана войдут в мертвое состояние, фоновый поток будет автоматически умирать (на самом деле, это легко понять, потому что цель фонового потока состоит в том, чтобы служить нити переднего плана. Поскольку все потоки переднего плана погибли, каково его использование все еще сохраняет его ... отлично!).
Расположение фонового потока: вызов метода SetDaemon (true) объекта потока может установить указанный поток в качестве фонового потока.
public Class Threadtest {public static void main (string [] args) {thread mythread = new mythread (); for (int i = 0; i <100; i ++) {System.out.println ("Основной поток i ="+i); if (i == 20) {mythread.setDaemon (true); mythread.start (); }}}}} класс mythread extends thread {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("i ="+i); try {thread.sleep (1); } catch (прерванная экспрессия e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}}}Определите, является ли поток фоновым потоком: вызовите метод isdeamon () объекта потока.
ПРИМЕЧАНИЕ. Основным потоком является поток переднего плана по умолчанию, дочерняя нить, созданная в создании потока переднего плана, является по умолчанию переднего плана, а поток, созданный в фоновом потоке, является фоновым потоком по умолчанию. При вызове метода SetDeamon (true) для установки потока переднего плана в качестве фонового потока он должен быть до того, как будет вызван метод start (). После того, как потоки умерли за день до вчерашнего дня, JVM уведомляет фоновую ветку, чтобы умереть, но это требует определенного времени от получения инструкций для ответа.
4. Измените приоритет потоков/setPriority ():
Каждый поток имеет определенный приоритет при выполнении, а потоки с высоким приоритетом имеют больше возможностей для выполнения. Каждый поток имеет тот же приоритет, что и поток, который его создал. Основной поток имеет нормальный приоритет по умолчанию.
Установите приоритет потока: setPriority (int priorityLevel). Диапазон приоритета параметра находится между 1-10, а обычно используемые три статические постоянные значения следующие:
Max_priority: 10
Min_priority: 1
Norm_priority: 5
Получите приоритет потока: GetPriority ().
Примечание. Объект потока с более высоким приоритетом потока только означает, что этот поток имеет больше возможностей для выполнения, а не приоритетного выполнения.
public Class Threadtest {public static void main (string [] args) {thread mythread = new mythread (); for (int i = 0; i <100; i ++) {System.out.println ("Основной поток i ="+i); if (i == 20) {mythread.setPriority (think.max_priority); mythread.start (); }}}}} класс mythread extends thread {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("i ="+i); }}}5. Концессии потока: доход ()
Основная роль урожайности () обсуждалась в предыдущем посте в блоге. В то же время метод доходности () также связан с приоритетом потока. Когда поток вызывает метод EILED (), чтобы переключаться из работающего состояния на состояние готового, процессор выберет потоки только с тем же приоритетом или более высоким приоритетом, что и поток из очереди потока состояния готового состояния для выполнения.
public Class Threadtest {public static void main (string [] args) {thread mythread1 = new mythread1 (); Thread MyThread2 = новый MyThread2 (); mythread1.setpriority (thread.max_priority); mythread2.setpriority (thread.min_priority); for (int i = 0; i <100; i ++) {System.out.println ("Основной поток i ="+i); if (i == 20) {mythread1.start (); mythread2.start (); Thread.yield (); }}}}} класс mythread1 extends Thread {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("Mythread 1 - i ="+i); }}} класс mythread2 extends thread {public void run () {for (int i = 0; i <100; i ++) {System.out.println ("Mythread 2 - i ="+i); }}}Серия статей:
Объяснение многопоточных экземпляров Java (i)
Подробное объяснение многопоточных экземпляров Java (II)
Подробное объяснение многопоточных экземпляров Java (III)