O conteúdo envolvido neste capítulo inclui:
1. Introdução ao sono ()
2. Sleep () Exemplo
3. Comparação entre Sleep () e Wait ()
1. Introdução ao sono ()
o sono () é definido em thread.java.
A função do Sleep () é deixar o fio atual dormir, ou seja, o encadeamento atual entrará do "estado em execução" para o "estado de sono (bloqueio)". Sleep () especificará o tempo de sono e o tempo de sono de thread será maior que/igual ao tempo de sono; a CPU a ser programada para executar.
2. Sleep () Exemplo
A seguir, é apresentado um exemplo simples para demonstrar o uso do sono ().
A cópia do código é a seguinte:
// Código fonte do SleepTest.java
classe threada estende thread {
public threada (nome da string) {
super (nome);
}
public sincronizado void run () {
tentar {
for (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Quando eu posso ser dividido por 4, durma por 100 milissegundos
if (i%4 == 0)
Thread.sleep (100);
}
} catch (interruptedException e) {
E.PrintStackTrace ();
}
}
}
classe pública SleepTest {
public static void main (string [] args) {
Threada T1 = new Threada ("T1");
t1.start ();
}
}
Resultados em execução:
A cópia do código é a seguinte:
T1: 0
T1: 1
T1: 2
T1: 3
T1: 4
T1: 5
T1: 6
T1: 7
T1: 8
T1: 9
Resultados Descrição:
O programa é relativamente simples, inicie o encadeamento T1 no thread principal principal. Após o início do T1, quando o cálculo I em T1 pode ser divisível por 4, o T1 dormirá por 100 milissegundos através do thread.Sleep (100).
Comparação entre Sleep () e Wait ()
Sabemos que a função de wait () é permitir que o thread atual insira o "aguarde (bloqueando) do" estado em execução "e também solte o bloqueio de sincronização. A função do Sleep () é deixar o encadeamento atual entrar no "Sleep (Blocking) State" do "Estado em execução".
No entanto, Wait () libera o bloqueio de sincronização do objeto, enquanto o Sleep () não libera o bloqueio.
O exemplo a seguir mostra que o Sleep () não liberará o bloqueio.
A cópia do código é a seguinte:
// Código fonte do sleeplocktest.java
classe pública SleeplockTest {
objeto estático privado obj = new Object ();
public static void main (string [] args) {
Threada T1 = new Threada ("T1");
Threada T2 = new Threada ("T2");
t1.start ();
t2.start ();
}
classe estática threada estende thread {
public threada (nome da string) {
super (nome);
}
public void run () {
// Obtenha a trava de sincronização do objeto OBJ
sincronizado (obj) {
tentar {
for (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Quando eu posso ser dividido por 4, durma por 100 milissegundos
if (i%4 == 0)
Thread.sleep (100);
}
} catch (interruptedException e) {
E.PrintStackTrace ();
}
}
}
}
}
Resultados em execução:
A cópia do código é a seguinte:
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
Resultados Descrição:
Dois threads T1 e T2 são iniciados na linha principal principal. T1 e T2 se referirão à trava de sincronização do mesmo objeto em run (), isto é, sincronizado (OBJ). Durante a execução do T1, apesar de ligar para o thread.Sleep (100); Porque T1 não libera a "trava síncrona mantida por Obj"!
Observe que, se comentarmos sincronizados (OBJ) e executarmos o programa novamente, o T1 e o T2 poderão ser alterados um para o outro. A seguir, o código -fonte após o comentário sincronizado (OBJ):
A cópia do código é a seguinte:
// sleeplocktest.java Código -fonte (comentado sincronizado (obj))
classe pública SleeplockTest {
objeto estático privado obj = new Object ();
public static void main (string [] args) {
Threada T1 = new Threada ("T1");
Threada T2 = new Threada ("T2");
t1.start ();
t2.start ();
}
classe estática threada estende thread {
public threada (nome da string) {
super (nome);
}
public void run () {
// Obtenha a trava de sincronização do objeto OBJ
// sincronizado (obj) {
tentar {
for (int i = 0; i <10; i ++) {
System.out.printf (" %s: %d/n", this.getName (), i);
// Quando eu posso ser dividido por 4, durma por 100 milissegundos
if (i%4 == 0)
Thread.sleep (100);
}
} catch (interruptedException e) {
E.PrintStackTrace ();
}
//}
}
}
}