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