1. Crea un hilo
Hay dos formas de crear subprocesos en Java: usando la clase Thread y usando la interfaz Runnable. Cuando utilice la interfaz Runnable, debe crear una instancia de Thread. Por lo tanto, ya sea que cree un hilo a través de la clase Thread o la interfaz Runnable, debe crear una instancia de la clase Thread o su subclase. Constructor de hilos:
Método 1: heredar la clase Thread y anular el método de ejecución
}
}
clase Demo extiende Thread{
ejecución pública vacía(){
para(int i=0;i<60;i++){
System.out.println(Thread.currentThread().getName()+i);
}
}
}
Así como las personas nacen, envejecen, enferman y mueren, los hilos también tienen que pasar por cuatro estados diferentes: iniciar (esperar), ejecutar, colgar y detenerse. Estos cuatro estados se pueden controlar mediante métodos de la clase Thread. Los métodos relacionados con estos cuatro estados en la clase Thread se detallan a continuación.
El hilo no ejecuta el código en el método de ejecución inmediatamente después de su establecimiento, sino que está en estado de espera. Cuando el hilo está en estado de espera, puede establecer varios atributos del hilo a través de los métodos de la clase Thread, como la prioridad del hilo (setPriority), el nombre del hilo (setName) y el tipo de hilo (setDaemon).
Cuando se llama al método de inicio, el hilo comienza a ejecutar el código en el método de ejecución. El hilo entra en estado de ejecución. Puede utilizar el método isAlive de la clase Thread para determinar si el hilo se está ejecutando. Cuando el hilo está en estado de ejecución, isAlive devuelve verdadero. Cuando isAlive devuelve falso, el hilo puede estar en estado de espera o detenido. El siguiente código demuestra el cambio entre los tres estados de creación, ejecución y detención del subproceso, y genera el valor de retorno isAlive correspondiente.
Una vez que el hilo comienza a ejecutar el método de ejecución, no saldrá hasta que se complete el método de ejecución. Sin embargo, durante la ejecución del hilo, existen dos métodos que se pueden utilizar para detener temporalmente la ejecución del hilo. Estos dos métodos son suspender y dormir. Después de usar suspender para suspender un hilo, puede reactivarlo mediante el método de reanudación. Después de usar la suspensión para hacer que el subproceso duerma, el subproceso solo puede estar en el estado listo después del tiempo establecido (después de que finaliza la suspensión del subproceso, es posible que el subproceso no se ejecute inmediatamente, solo ingresa al estado listo, esperando que el sistema lo programe) .
Hay dos puntos a tener en cuenta al utilizar el método del sueño:
1. El método de suspensión tiene dos formas sobrecargadas. Una de las formas sobrecargadas no solo puede establecer milisegundos, sino también nanosegundos (1.000.000 de nanosegundos equivalen a 1 milisegundo). Sin embargo, la máquina virtual Java en la mayoría de las plataformas de sistemas operativos no tiene una precisión de nanosegundos. Por lo tanto, si se configuran los nanosegundos para la suspensión, la máquina virtual Java tomará el milisegundo más cercano a este valor.
2. Se deben utilizar throws o try{...}catch{...} cuando se utiliza el método de suspensión. Debido a que el método de ejecución no puede usar throws, solo puede usar try{...}catch{...}. Cuando el subproceso está inactivo y se utiliza el método de interrupción para interrumpir el subproceso, el modo de suspensión generará una InterruptedException. El método de sueño se define de la siguiente manera:
Hay tres formas de terminar un hilo.
1. Utilice el indicador de salida para que el hilo salga normalmente, es decir, el hilo termina cuando se completa el método de ejecución.
2. Utilice el método de detención para finalizar el hilo a la fuerza (este método no se recomienda porque detener, al igual que suspender y reanudar, también puede producir resultados impredecibles).
3. Utilice el método de interrupción para interrumpir el hilo.
1. Termine el hilo usando la bandera de salida.
Cuando se ejecuta el método de ejecución, el hilo saldrá. Pero a veces el método de ejecución nunca termina. Por ejemplo, los subprocesos se utilizan en programas de servidor para monitorear las solicitudes de los clientes u otras tareas que requieren procesamiento cíclico. En este caso, estas tareas generalmente se colocan en un bucle, como un bucle while. Si desea que el bucle se ejecute para siempre, puede utilizar while(true){...} para manejarlo. Pero si desea que el bucle while salga bajo una determinada condición, la forma más directa es establecer un indicador de tipo booleano y establecer este indicador en verdadero o falso para controlar si el bucle while sale. A continuación se proporciona un ejemplo de cómo terminar un hilo usando el indicador de salida.
La función del método de unión es hacer que los subprocesos de ejecución asincrónica se conviertan en ejecución sincrónica. Es decir, cuando se llama al método de inicio de la instancia del hilo, este método regresará inmediatamente. Si necesita usar un valor calculado por este hilo después de llamar al método de inicio, debe usar el método de unión. Si no utiliza el método de unión, no hay garantía de que cuando se ejecute una declaración después del método de inicio, se ejecutará el hilo. Después de usar el método de unión, el programa no continuará ejecutándose hasta que este hilo salga. El siguiente código demuestra el uso de join.
3. Problemas de seguridad de subprocesos múltiples
Causa del problema: cuando varias declaraciones operan en el mismo subproceso y comparten datos, un subproceso solo ejecuta parte de las múltiples declaraciones. Antes de que se complete la ejecución, otro subproceso participa en la ejecución, lo que provoca errores de datos compartidos.
Solución: para varias declaraciones que operan con datos compartidos, solo se puede ejecutar un subproceso durante el proceso de ejecución, otros subprocesos no se ejecutarán.
Bloque de código sincrónico:
}
}
}
}
ejecución pública vacía(){
mientras (verdadero) {
ventaBoleto();
}
}
}
Comunicación entre hilos
x=(x+1)%2;
}
}
}).comenzar();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
p.get();
}
}
}).comenzar();
}
}
/*
Zhang San....Hombre Zhang San....Hombre
lili....nv
lili....hombre Zhang San....nv
lili....masculino
*/
}
}
}).comenzar();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
sincronizado (p) {
p.get();
}
}
}
}).comenzar();
}
}
/*
lili....nv
lili....nv
lili....nv
lili....nv
lili....nv
lili....nv
Zhang San....Hombre Zhang San....Hombre Zhang San....Hombre Zhang San....Hombre
*/
}
}
}).comenzar();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
sincronizado (p) {
si (! banderas)
intentar {
p.esperar();
} captura (Excepción interrumpida e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
};
p.get();
banderas =falso;
p.notificarTodos();
}
}
}
}).comenzar();
}
}
}
Bienes finales g =Bienes nuevos();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
g.produce("bienes");
}
}
}).comenzar();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
g.consumir();
}
}
}).comenzar();
}
}
}
Bienes finales g =Bienes nuevos();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
g.produce("bienes");
}
}
},"Productor nº1".start();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
g.produce("bienes");
}
}
},"Productor No. 2".start();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
g.consumir();
}
}
},"Consumidor nº1".start();
nuevo hilo (nuevo ejecutable(){
ejecución pública vacía(){
mientras (verdadero) {
g.consumir();
}
}
},"Consumidor nº 2".start();
}
}
/*
Consumidor nº 2 consumido ****** número de producto: 48049
Productor Uno producido....Número de artículo: 48050
Consumidor nº1 consumido ****** número de producto: 48050
Productor Uno producido....Número de artículo: 48051
Consumidor nº 2 consumido ****** número de producto: 48051
Productor No.2 producido....Número de artículo: 48052
Consumidor nº 2 consumido ****** número de producto: 48052
Productor Uno producido....Número de artículo: 48053
Consumidor nº1 consumido ****** número de producto: 48053
Productor Uno producido....Número de artículo: 48054
Consumidor nº 2 consumido ****** número de producto: 48054
Productor No.2 producido....Número de artículo: 48055
Consumidor nº 2 consumido ****** número de producto: 48055
*/