Notas de estudio básico multiproceso

Comprender el subproceso múltiple

Proceso e hilo

Un proceso es un programa en una computadora y un subproceso es la unidad de ejecución en el
proceso Un proceso tiene muchos subprocesos, montones y áreas de método, y un subproceso tiene su propia pila, contador de programa y pila de método local.

Simultaneidad y paralelismo

Simultaneidad: se ejecutan varias tareas al
mismo tiempo En paralelo: se ejecutan varias tareas al mismo tiempo

Por que usar multihilo

Procesador único: la operación de io y la operación de la CPU no se pueden ejecutar al mismo tiempo, el subproceso múltiple puede mejorar la eficiencia de la operación del programa.Multiprocesador
: el uso de un solo subproceso no puede usar todos los
servidores de la CPU al mismo tiempo: es necesario responder a múltiples usuarios solicitudes al mismo tiempo

Problemas que se deben resolver al utilizar subprocesos múltiples

1, seguridad de subprocesos
2, interbloqueo
3, fuga de memoria

Implementación multiproceso

Heredar la clase Thread

1. Construya una subclase de Thread, reescriba el método de ejecución.
2. Cree un objeto de instancia de la subclase y llame al método de inicio.
Características: Java solo puede heredar una clase principal

¿Por qué no utilizar el método de ejecución directamente?

La ejecución de ejecutar solo puede ejecutar el código interno, y el inicio puede iniciar un hilo

Implementar la interfaz Runnable

1. Construya el objeto de instancia de la subclase de interfaz Runnable, reescriba el método de ejecución
2. Cree el objeto de instancia de la subclase
3. Llame al método de construcción Thread parametrizado, llame al método de inicio
Características: Java puede implementar múltiples interfaces, evitando las limitaciones de herencia única
Mejor manejo de recursos compartidos

Implementar la interfaz invocable

1. Construya un objeto de instancia de la subclase de interfaz invocable, reescriba el método de llamada
2. Cree un objeto de instancia de la subclase
3. Llame al método de construcción FutureTask parametrizado
4. Llame al método de construcción Thread parametrizado, llame al método de inicio
Características: valor de retorno , Declarable para lanzar una excepción

Código:

public class Test2 {
    
    

	public static void main(String[] args) throws InterruptedException, ExecutionException {
    
    
		Thread1 t1 = new Thread1();
		t1.start();
		Thread2 t2 = new Thread2();
		new Thread(t2).start();
		Thread3 t3 = new Thread3();
		FutureTask<Object> f = new FutureTask<>(t3);
		Thread t = new Thread(f);
		t.start();
		System.out.println(f.get());
	}
}

class Thread1 extends Thread{
    
    
	public void run() {
    
    
		for(int i = 0; i < 10; i++) {
    
    
			System.out.println(Thread.currentThread().getName() + i);
		}
	}
}

class Thread2 implements Runnable{
    
    
	public void run() {
    
    
		for(int i = 0; i < 10; i++) {
    
    
			System.out.println(Thread.currentThread().getName() + i);
		}
	}
}

class Thread3 implements Callable<Object>{
    
    
	public Object call() throws Exception {
    
    
		// TODO Auto-generated method stub
		for(int i = 0; i < 10; i++) {
    
    
			System.out.println(Thread.currentThread().getName() + i);
		}
		return 10;
	}
}

Ciclo de vida del hilo

Nuevo

Cuando se crea el objeto

Ejecutable

Después de llamar al método de inicio, se vuelve operativo. Se
divide en listo y en ejecución.

cuadra

Generalmente relacionado
con bloqueos. El bloqueo ocurre mientras se espera para adquirir bloqueos
. También ocurre cuando se emiten solicitudes de E / S.

Espere

La espera ocurre cuando se usa join, wait y otros métodos sin parámetros. Después de que
otros subprocesos usen notificar y notificar a todos, el subproceso estará listo.

Espera cronometrada

Use sleep, wait y únase a los parámetros para esperar regularmente. Después de que
otros subprocesos usen notificar y notificar a todos, el subproceso
ingresará al estado listo. Cuando se acabe el tiempo , el subproceso también ingresará al estado listo.

muerte

La ejecución se completa o se lanza una excepción, el hilo muere cuando ocurre el error
y no puede entrar en otros estados después de la muerte

Programación de subprocesos

Programación preventiva: esforzarse por obtener recursos de la CPU de acuerdo con la prioridad.
Programación de tiempos: los subprocesos obtienen porciones de tiempo del tamaño del tiempo y las ejecutan

prioridad

La alta prioridad es fácil de obtener recursos de la CPU, la
prioridad se divide en 1 a 10
cambios de prioridad, use el método setPriority

concesión

El subproceso entra en el estado listo y cede los recursos de la CPU.
Utilice el método de rendimiento

Latente

Usa el método de dormir para hacer que el hilo duerma

Saltar en línea

Se inserta un hilo en el hilo B, solo cuando A termina de ejecutarse, B puede
usar el método de unión

Entre bastidores

Los subprocesos se dividen en primer plano y en segundo plano. Por defecto, están en primer plano. Los
subprocesos en primer plano están terminados y el programa finaliza. Debes
usar el método setDeamon antes de usar el método de inicio.

Sincronización multiproceso

A salvo de amenazas

Cuando hay un retraso, causará problemas de seguridad, similares a los de la base de datos.

Bloque de código de sincronización

Utilice el método sincronizado para bloquear un objeto, el siguiente bloque de código está sincronizado

El objeto es arbitrario, pero debe ser el mismo. El valor de la etiqueta es 1 cuando el bloque de código no se ejecuta y 0 cuando se usa. Cuando es 0, otros subprocesos no pueden ejecutar el bloque de código.

Método de sincronización

Método modificado con sincronizado, el método modificado está sincronizado

El objeto bloqueado cuando el método está bloqueado es el objeto que llamó al método

Método estático sincrónico

No se crea ningún objeto, el bloqueo del método estático sincronizado es el objeto de clase del método

Desventajas de sincronizado: cada llamada de hilo necesita determinar el valor de la etiqueta de bloqueo, lo que consume
mucho tiempo, el hilo necesita esperar hasta que se obtenga el bloqueo.

Bloqueo de sincronización

Use la interfaz Lock y la clase de implementación ReentrantLock para construir un bloqueo, y use el método de bloqueo y el método de desbloqueo para lograr la sincronización de subprocesos.
Generalmente, el método de desbloqueo se escribe finalmente

Después de que el subproceso no puede solicitar el bloqueo varias veces, ya no espera, lo que es más flexible

Comunicación multiproceso

La diferencia entre esperar y dormir:

El usuario de sleep es un hilo y el objeto usado por wait es un objeto de bloqueo de sincronización.
Wait abandona el objeto de bloqueo. Sleep no se rinde
. El hilo de espera no se despierta automáticamente. Necesita notificar y notificar a todos. Después de que se ejecute el método de suspensión (y esperar con los parámetros), el hilo se activará automáticamente.

La diferencia entre notificar y notificar a todos

Notificar despierta el primer hilo en espera en el bloqueo de sincronización (el primer hilo que llama a esperar), notificar a todos despierta todos los hilos en espera

Supongo que te gusta

Origin blog.csdn.net/sekever/article/details/114680283
Recomendado
Clasificación