Às vezes, precisamos interromper o thread em execução em um determinado momento. Por exemplo, um thread que verifica o status de um sensor uma vez a cada minuto. No restante do tempo, o thread não precisa fazer nada. Durante esse tempo, o thread não precisa usar nenhum recurso do computador. Após esse período de tempo e quando a máquina virtual Java agendar o encadeamento, o encadeamento continuará a ser executado. Para fazer isso, você pode usar o método sleep() da classe Thread. Este método atrasa a execução do thread por suspensão, e o parâmetro de tipo inteiro especifica o número de milissegundos para suspensão. Quando o método sleep() é chamado e o tempo de suspensão termina, a máquina virtual Java aloca o tempo de execução da CPU para o thread, e o thread continuará a ser executado.
Outra forma de utilizar o método sleep() é através dos elementos do tipo de enumeração TimeUnit. Este método usa o método sleep() do Thread para fazer o thread atual dormir. Ele pode aceitar a unidade de tempo especificada como parâmetro e convertê-la no número correspondente de milissegundos.
Nesta seção, desenvolveremos um programa que usa o método sleep() para imprimir a hora atual a cada segundo.
saiba disso
Siga as etapas mostradas abaixo para implementar os exemplos nesta seção.
1. Crie uma classe chamada FileClock e implemente a interface Runnable. O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública FileClock implementa Runnable {
2. Implemente o método run(). O código é o seguinte:
Copie o código do código da seguinte forma:
@Substituir
execução void pública() {
3. Escreva um loop que percorra dez vezes. Em cada iteração, crie um objeto Date e imprima-o no console. Em seguida, chame o método sleep() por meio da propriedade SECONDS de TimeUtil para atrasar a execução do thread por um segundo. Achei que o método sleep() lançaria InterruptedException. Portanto, precisamos escrever mais algumas linhas de código para capturar exceções. Quando um thread pode ser interrompido, é sempre uma boa prática liberar ou fechar os recursos usados no thread. O código é o seguinte:
Copie o código do código da seguinte forma:
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", nova Data());
tentar {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("O FileClock foi interrompido./n");
}
}
4. Já temos uma classe de thread bem implementada. Agora, vamos implementar a classe principal. Crie uma classe chamada FileMain e implemente o método main(). O código é o seguinte:
Copie o código do código da seguinte forma:
classe pública ArquivoMain {
public static void main(String[] args) {
5. Crie um objeto FileClock e, a seguir, crie um thread para executar tarefas. Então, inicie o tópico. O código é o seguinte:
Copie o código do código da seguinte forma:
Relógio FileClock = new FileClock();
Thread thread = new Thread(relógio);
thread.start();
6. No thread principal, chame o método sleep() por meio da propriedade SECONDS de TimeUtil para aguardar cinco segundos. O código é o seguinte:
Copie o código do código da seguinte forma:
tentar {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
7. Interrompa o thread FileClock. O código é o seguinte:
Copie o código do código da seguinte forma:
thread.interrupt();
8. Execute o exemplo e verifique o efeito da execução.
sabe por que
Ao executar este programa, você descobrirá como o programa imprime o objeto de data a cada segundo e como o thread é interrompido.
Quando o método sleep() é chamado, o thread sai da CPU e interrompe a execução por um período de tempo. Durante esse tempo, o thread não precisa mais da CPU, então a CPU pode realizar outras tarefas.
Quando um thread suspenso é interrompido, uma InterruptedException será lançada imediatamente em vez de esperar até que o sono termine.
sem fim
Na API de simultaneidade Java, existe outro método para permitir que threads desistam da CPU. Este é o método yield(). Chamar esse método envia uma mensagem para a máquina virtual Java indicando que o thread pode ceder a CPU para outros threads. A máquina virtual Java não garante responder a esta solicitação. Normalmente, este método é usado apenas durante a depuração do programa.
Usar doutrina
Este artigo foi traduzido do "Java 7 Concurrency Cookbook" (D Gua Ge o roubou como "Java7 Concurrency Sample Collection") e é usado apenas como material de aprendizagem. Não pode ser utilizado para quaisquer fins comerciais sem autorização.
Pequeno sucesso
A versão completa do código de exemplo usado nesta seção.
O código completo da classe FileClock é o seguinte:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe5;
importar java.util.Date;
importar java.util.concurrent.TimeUnit;
/**
* Imprima a data e hora atuais no console a cada segundo.
* Data: 18/09/2013
* Horário: 23h11
*/
classe pública FileClock implementa Runnable {
@Substituir
execução void pública() {
for (int i = 0; i < 10; i++) {
System.out.printf("%s/n", nova Data());
tentar {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
System.out.printf("O FileClock foi interrompido./n");
}
}
}
Código completo da classe FileMain
Copie o código do código da seguinte forma:
pacote com.diguage.books.concurrencycookbook.chapter1.recipe5;
importar java.util.concurrent.TimeUnit;
/**
* Tópico de demonstração suspenso e retomado
* Data: 19/09/2013
* Horário: 00h29
*/
classe pública ArquivoMain {
public static void main(String[] args) {
Relógio FileClock = new FileClock();
Thread thread = new Thread(relógio);
thread.start();
tentar {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}