En un programa Java de subprocesos múltiples, todo el programa no saldrá hasta que todos los subprocesos hayan completado la ejecución. (Cabe señalar que se completa la ejecución de todos los subprocesos que no son demonios; si un subproceso ejecuta el método System.exit(), el programa también saldrá). A veces, desea cancelar la ejecución de un subproceso, por ejemplo, si desea salir del programa, o desea cancelar una tarea que se está ejecutando, etc.
Java proporciona un mecanismo de interrupción que nos permite interrumpir explícitamente el hilo que queremos que finalice la ejecución. Una característica del mecanismo de interrupción es que podemos verificar si el hilo ha sido interrumpido y luego decidir si respondemos a la solicitud de cancelación. El hilo también puede ignorar la solicitud de cancelación y continuar la ejecución.
En esta sección, el programa de muestra que desarrollamos creará un hilo y, después de cinco segundos, utilizará el mecanismo de interrupción para finalizar el hilo a la fuerza.
lo sabes
Siga los pasos a continuación para completar el programa de muestra.
1. Cree una clase llamada PrimeGenerator y herede la clase Thread. El código es el siguiente:
Copie el código de código de la siguiente manera:
clase pública PrimeGenerator extiende Thread {
2. Vuelva a escribir el método run() y agregue un bucle infinito en el método. Dentro del bucle, verifique si los enteros positivos consecutivos que comienzan desde 1 son números primos mediante el cálculo. Si es así, imprima en la consola. El código es el siguiente:
Copie el código de código de la siguiente manera:
@Anular
ejecución pública vacía() {
número largo = 1L;
mientras (verdadero) {
si (esPrime(número)) {
System.out.printf("Número %d /tis Prime.", número);
}
3. Después de procesar un número, verifique si el hilo fue interrumpido llamando al método isInterrupted(). Si este método devuelve verdadero, se imprime una oración en la consola y luego finaliza la ejecución del hilo. El código es el siguiente:
Copie el código de código de la siguiente manera:
si (está interrumpido()) {
System.out.println("El generador principal ha sido interrumpido");
devolver;
}
número++;
}
}
4. Implemente el método isPrime (), que se utiliza para determinar si el parámetro es un número primo. Si es así, devuelve verdadero; de lo contrario, devuelve falso. El código es el siguiente:
Copie el código de código de la siguiente manera:
/**
* Determinar si el parámetro es un número primo.
*
* @param number El número a juzgar
* @devolver
*/
booleano privado esPrime (número largo) {
si (número <= 2) {
devolver verdadero;
}
para (int i = 2; i < número; i++) {
si ((número % i) == 0) {
devolver falso;
}
}
devolver verdadero;
}
5. Ahora, implemente la clase principal del programa de muestra, la clase Main y el método main(). El código es el siguiente:
Copie el código de código de la siguiente manera:
clase pública principal {
público estático vacío principal (String [] argumentos) {
6. Cree un objeto PrimeGenerator e inicie el hilo. El código es el siguiente:
Copie el código de código de la siguiente manera:
Tarea de hilo = new PrimeGenerator();
tarea.start();
7. Espere cinco segundos y luego finalice el hilo. El código es el siguiente:
Copie el código de código de la siguiente manera:
intentar {
Unidad de tiempo.SEGUNDOS.sueño(5L);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
tarea.interrupt();
8. Ejecute el ejemplo y vea los resultados.
saber por qué
A continuación se muestra un fragmento impreso de la ejecución del programa de ejemplo. A partir de los caracteres impresos, podemos ver cómo el hilo PrimeGenerator imprime información y cómo finalizar su ejecución cuando detecta que el hilo está interrumpido.
Copie el código de código de la siguiente manera:
El número 43063 es primo.
El número 43067 es primo.
El número 43093 es primo.
El número 43103 es primo.
El número 43117 es primo.
El generador principal ha sido interrumpido
El hilo tiene una función booleana para indicar si el hilo ha sido interrumpido. Cuando se llama al método de interrupción (), se establece en verdadero. El método isInterrupted() devuelve el valor actual de la propiedad.
interminable
Thread también tiene un método para verificar si el subproceso está interrumpido: el método estático interrumpido (), que puede verificar si el subproceso que se está ejecutando actualmente está interrumpido.
Copie el código de código de la siguiente manera:
Existe una gran diferencia entre el método isInterrupted() y el método interrumpido(). El primero no cambiará el valor de la propiedad de si el hilo se interrumpe, mientras que el segundo puede establecer su valor en falso. interrumpido () es un método estático; se recomienda utilizar el método isInterrupted () para el desarrollo diario.
Como se mencionó anteriormente, un hilo puede ignorar la solicitud de interrupción y continuar la ejecución. Sin embargo, este no es el resultado que queremos.
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
Una versión completa de todo el código utilizado en el programa de ejemplo.
El código completo de la clase PrimeGenerator es el siguiente:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe3;
/**
* Fecha: 2013-09-18
* Hora: 11:53
*/
clase pública PrimeGenerator extiende Thread {
@Anular
ejecución pública vacía() {
número largo = 1L;
mientras (verdadero) {
si (esPrime(número)) {
System.out.printf("Número %d /tis Prime./n", número);
}
si (está interrumpido()) {
System.out.println("El generador principal ha sido interrumpido");
devolver;
}
número++;
}
}
/**
* Determinar si el parámetro es un número primo.
*
* @param number El número a juzgar
* @devolver
*/
booleano privado esPrime (número largo) {
si (número <= 2) {
devolver verdadero;
}
para (int i = 2; i < número; i++) {
si ((número % i) == 0) {
devolver falso;
}
}
devolver verdadero;
}
}
El código completo de la clase principal.
Copie el código de código de la siguiente manera:
paquete com.diguage.books.concurrencycookbook.chapter1.recipe3;
importar java.util.concurrent.TimeUnit;
/**
* Fecha: 2013-09-18
* Hora: 12:33
*/
clase pública principal {
público estático vacío principal (String [] argumentos) {
Tarea de hilo = new PrimeGenerator();
tarea.start();
intentar {
Unidad de tiempo.SEGUNDOS.sueño(5L);
} captura (Excepción interrumpida e) {
e.printStackTrace();
}
tarea.interrupt();
}
}