Содержание, связанное с этой главой, включает в себя:
1. Введение в сон ()
2. Пример Sleep ()
3. Сравнение между Sleep () и Wait ()
1. Введение в сон ()
Sleep () определяется в Thread.java.
Функция Sleep () состоит в том, чтобы позволить нынешнему потоку спать, то есть текущий поток будет входить из «состояния бега» в состояние «сон (блокировка)». Sleep () будет указывать время сна, и время сна в нити будет больше, чем/равно времени сна; ЦП запланирован на выполнение.
2. Пример Sleep ()
Ниже приведен простой пример, чтобы продемонстрировать использование сна ().
Кода -копия выглядит следующим образом:
// исходный код sleeptest.java
Class Threada Extends Thread {
public Threada (String name) {
супер (имя);
}
публичный синхронизированный void run () {
пытаться {
для (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Когда меня можно разделить на 4, спать на 100 миллисекунд
if (i%4 == 0)
Thread.sleep (100);
}
} catch (прерванная экспрессия e) {
e.printstacktrace ();
}
}
}
открытый класс Sleeptest {
public static void main (string [] args) {
Threada T1 = new Threada ("T1");
t1.start ();
}
}
Результаты работы:
Кода -копия выглядит следующим образом:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
Результаты Описание:
Программа относительно проста, начала потока T1 в основном потоке. После начала T1, когда расчет I в T1 можно делить на 4, T1 будет спать на 100 миллисекунд через нить. Sleep (100).
Сравнение между Sleep () и Wait ()
Мы знаем, что функция wait () состоит в том, чтобы позволить текущему потоку войти в состояние «wat (блокировка) из« состояния работы », а также освободить блокировку синхронизации. Функция Sleep () состоит в том, чтобы позволить текущему потоку войти в состояние «сон (блокировка)» из «состояния бега».
Тем не менее, Wait () выпускает блокировку синхронизации объекта, в то время как Sleep () не выпускает блокировку.
В следующем примере показано, что Sleep () не выпустит замок.
Кода -копия выглядит следующим образом:
// исходный код sleeplocktest.java
открытый класс sleeplocktest {
частный статический объект obj = new Object ();
public static void main (string [] args) {
Threada T1 = new Threada ("T1");
Threada T2 = new Threada ("T2");
t1.start ();
t2.start ();
}
Static Class Threada Extends Thread {
public Threada (String name) {
супер (имя);
}
public void run () {
// Получить блокировку синхронизации объекта OBJ
синхронизированный (obj) {
пытаться {
для (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Когда меня можно разделить на 4, спать на 100 миллисекунд
if (i%4 == 0)
Thread.sleep (100);
}
} catch (прерванная экспрессия e) {
e.printstacktrace ();
}
}
}
}
}
Результаты работы:
Кода -копия выглядит следующим образом:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
T2: 0
T2: 1
T2: 2
T2: 3
T2: 4
T2: 5
T2: 6
T2: 7
T2: 8
T2: 9
Результаты Описание:
Две потоки T1 и T2 запускаются в основной резьбе Main. T1 и T2 будут ссылаться на блокировку синхронизации того же объекта в run (), то есть синхронизированный (OBJ). Во время работы T1, хотя он будет называть Thread.sleep (100); Потому что T1 не выпускает «синхронная блокировка, удерживаемая OBJ»!
Обратите внимание, что если мы прокомментируем синхронизированный (OBJ) и снова выполним программу, T1 и T2 могут быть переключены друг на друга. Ниже приведен исходный код после синхронизации Tune Comment (OBJ):
Кода -копия выглядит следующим образом:
// Sleeplocktest.java исходный код (прокомментированный синхронизированный (obj))
открытый класс sleeplocktest {
частный статический объект obj = new Object ();
public static void main (string [] args) {
Threada T1 = new Threada ("T1");
Threada T2 = new Threada ("T2");
t1.start ();
t2.start ();
}
Static Class Threada Extends Thread {
public Threada (String name) {
супер (имя);
}
public void run () {
// Получить блокировку синхронизации объекта OBJ
// синхронизированный (obj) {
пытаться {
для (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Когда меня можно разделить на 4, спать на 100 миллисекунд
if (i%4 == 0)
Thread.sleep (100);
}
} catch (прерванная экспрессия e) {
e.printstacktrace ();
}
//}
}
}
}