A veces, necesitamos interrumpir el hilo de ejecución en un momento específico. Por ejemplo, un hilo que comprueba el estado de un sensor una vez por minuto. El resto del tiempo, el hilo no necesita hacer nada. Durante este tiempo, el hilo no necesita utilizar ninguno de los recursos de la computadora. Una vez transcurrido este período de tiempo, y cuando la máquina virtual Java programa el subproceso, el subproceso continúa ejecutándose. Para hacer esto, puedes usar el método sleep() de la clase Thread. Este método retrasa la ejecución del hilo al dormir y el parámetro de tipo entero especifica la cantidad de milisegundos para dormir. Cuando se llama al método sleep () y finaliza el tiempo de suspensión, la máquina virtual Java asigna tiempo de ejecución de la CPU al subproceso y el subproceso continuará ejecutándose.
Otra forma de utilizar el método sleep() es a través de los elementos del tipo de enumeración TimeUnit. Este método utiliza el método sleep() de Thread para hacer que el hilo actual duerma. Puede aceptar la unidad de tiempo especificada como parámetro y convertirla al número correspondiente de milisegundos.
En esta sección, desarrollaremos un programa que utiliza el método sleep() para imprimir la hora actual cada segundo.
lo sabes
Siga los pasos que se muestran a continuación para implementar los ejemplos de esta sección.
1. Cree una clase llamada FileClock e implemente la interfaz Runnable. El código es el siguiente:
Copie el código de código de la siguiente manera:
la clase pública FileClock implementa Runnable {
2. Implemente el método run(). El código es el siguiente:
Copie el código de código de la siguiente manera:
@Anular
ejecución pública vacía() {
3. Escriba un bucle que lo recorra diez veces. En cada iteración, cree un objeto Fecha e imprímalo en la consola. Luego, llame al método sleep() a través de la propiedad SECONDS de TimeUtil para retrasar la ejecución del hilo durante un segundo. Pensé que el método sleep() arrojaría InterruptedException. Por lo tanto, necesitamos escribir algunas líneas más de código para detectar excepciones. Cuando un hilo puede ser interrumpido, siempre es una buena práctica liberar o cerrar los recursos utilizados en el hilo. El código es el siguiente:
Copie el código de código de la siguiente manera:
para (int i = 0; i < 10; i++) {
System.out.printf("%s/n", nueva fecha());
intentar {
Unidad de tiempo.SEGUNDOS.dormir(1);
} captura (Excepción interrumpida e) {
System.out.printf("El FileClock ha sido interrumpido./n");
}
}
4. Ya tenemos una clase de hilo bien implementada. Ahora, implementemos la clase principal. Cree una clase llamada FileMain e implemente el método main(). El código es el siguiente:
Copie el código de código de la siguiente manera:
clase pública Archivo Principal {
público estático vacío principal (String [] argumentos) {
5. Cree un objeto FileClock y luego cree un hilo para realizar tareas. Entonces, inicia el hilo. El código es el siguiente:
Copie el código de código de la siguiente manera:
Reloj FileClock = nuevo FileClock();
Hilo hilo = nuevo hilo (reloj);
hilo.start();
6. En el hilo principal, llame al método sleep() a través de la propiedad SECONDS de TimeUtil para esperar cinco segundos. El código es el siguiente:
Copie el código de código de la siguiente manera:
intentar {
Unidad de tiempo.SEGUNDOS.dormir(5);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
7. Interrumpa el hilo de FileClock. El código es el siguiente:
Copie el código de código de la siguiente manera:
hilo.interrupt();
8. Ejecute el ejemplo y verifique el efecto de ejecución.
saber por qué
Cuando ejecuta este programa, encontrará cómo el programa imprime el objeto de fecha cada segundo y cómo se interrumpe el hilo.
Cuando se llama al método sleep(), el hilo abandonará la CPU y detendrá la ejecución por un período de tiempo. Durante este tiempo, el subproceso ya no necesita la CPU, por lo que la CPU puede realizar otras tareas.
Cuando se interrumpe un hilo inactivo, se generará una InterruptedException inmediatamente en lugar de esperar hasta que finalice el modo inactivo.
interminable
En la API de concurrencia de Java, existe otro método para permitir que los subprocesos cedan la CPU. Este es el método rendimiento (). Llamar a este método envía un mensaje a la máquina virtual Java indicando que el subproceso puede ceder la CPU a otros subprocesos. La máquina virtual Java no garantiza responder a esta solicitud. Normalmente, este método sólo se utiliza al depurar el programa.
Usar doctrina
Este artículo está traducido del "Libro de cocina de concurrencia de Java 7" (D Gua Ge lo robó como "Colección de ejemplos de concurrencia de Java 7") y solo se utiliza como material de aprendizaje. No puede utilizarse con fines comerciales sin autorización.
Pequeño éxito
La versión completa del código de muestra utilizado en esta sección.
El código completo de la clase FileClock es el siguiente:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe5;
importar java.util.Fecha;
importar java.util.concurrent.TimeUnit;
/**
* Imprime la fecha y hora actuales en la consola cada segundo.
* Fecha: 2013-09-18
* Hora: 23:11
*/
la clase pública FileClock implementa Runnable {
@Anular
ejecución pública vacía() {
para (int i = 0; i < 10; i++) {
System.out.printf("%s/n", nueva fecha());
intentar {
Unidad de tiempo.SEGUNDOS.dormir(1);
} captura (Excepción interrumpida e) {
System.out.printf("El FileClock ha sido interrumpido./n");
}
}
}
Código completo de la clase FileMain
Copie el código de código de la siguiente manera:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe5;
importar java.util.concurrent.TimeUnit;
/**
* Hilo de demostración suspendido y reanudado
* Fecha: 2013-09-19
* Hora: 00:29
*/
clase pública Archivo Principal {
público estático vacío principal (String [] argumentos) {
Reloj FileClock = nuevo FileClock();
Hilo hilo = nuevo hilo (reloj);
hilo.start();
intentar {
Unidad de tiempo.SEGUNDOS.dormir(5);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
hilo.interrupt();
}
}