Red de conocimiento de abogados - Derecho de sociedades - Puntos de conocimiento sobre subprocesos múltiples que todo jugador de Android debería conocer~

Puntos de conocimiento sobre subprocesos múltiples que todo jugador de Android debería conocer~

Un proceso es una unidad independiente de programación del sistema y asignación de recursos.

En Android, una aplicación es una integración independiente. La aplicación se ejecuta en un entorno independiente para evitar interferencias de otras aplicaciones/procesos. Cuando iniciamos una aplicación, el sistema creará un proceso (el proceso se bifurca de Zygote y tiene una ID independiente), luego creará un hilo principal para este proceso y luego podrá ejecutar MainActivity. Los componentes de la aplicación se ejecutan en sus propios procesos. por defecto. Los desarrolladores pueden configurar el proceso de ejecución de los componentes de la aplicación y configurar el componente en el archivo de manifiesto: android:process = "nombre del proceso" para lograr el propósito de permitir que los componentes se ejecuten en diferentes procesos. Existen ventajas y desventajas de que los componentes se ejecuten en diferentes procesos. Expliquemoslo por turno.

Beneficios: Cada aplicación (es decir, cada proceso) tendrá un presupuesto de memoria. La memoria total utilizada por todos los programas que se ejecutan en este proceso no puede exceder este valor, lo que permite que los componentes se ejecuten en diferentes procesos. permite que el proceso principal tenga más recursos espaciales. Cuando nuestra aplicación es relativamente grande y requiere muchos recursos de memoria (es decir, cuando los usuarios se quejan de que a menudo ocurre OutOfMemory en la aplicación), podemos considerar el uso de múltiples procesos.

Desventajas: cada proceso tendrá su propia instancia de máquina virtual, por lo que resulta relativamente difícil compartir algunos datos entre procesos. Se requiere comunicación entre procesos para lograr el intercambio de datos.

Un subproceso es una entidad de un proceso y la unidad básica de programación y despacho de la CPU. Es una unidad básica que es más pequeña que un proceso y puede ejecutarse de forma independiente.

En Android, los hilos tienen varios estados: creado, listo, en ejecución, bloqueado y finalizado. Cuando la aplicación tiene componentes en ejecución, el subproceso de la interfaz de usuario se está ejecutando. De forma predeterminada, las operaciones de todos los componentes de la aplicación se completan en el hilo de la interfaz de usuario, incluida la respuesta a las operaciones del usuario (tocar, hacer clic, etc.), llamar a los métodos del ciclo de vida de los componentes, actualizar la interfaz de usuario, etc. Por lo tanto, si el subproceso de la interfaz de usuario maneja el estado de bloqueo (realizando algunas operaciones que requieren mucho tiempo en el subproceso, como conexiones de red, etc.), no podrá responder a varias operaciones. Si el tiempo de bloqueo alcanza los 5 segundos, el El programa estará en estado ANR (aplicación, no respuesta).

1. El papel de los subprocesos

Reduzca la sobrecarga de tiempo y espacio incurrida por los programas durante la ejecución concurrente y mejore el rendimiento de concurrencia del sistema operativo.

2. Clasificación de subprocesos

Subproceso demonio, subproceso no demonio (subproceso de usuario)

2.1 Subproceso demonio

Definición: proteger usuario hilo Un hilo que proporciona un servicio general a otros hilos cuando el programa se está ejecutando

Común: como el hilo de recolección de basura

Método de configuración: thread.setDaemon(true);//Set this El hilo es un hilo de demonio

2.2 Hilo que no es demonio (hilo de usuario)

Hilo principal y hilo secundario.

2.2.1 Hilo principal (hilo UI)

Definición: El sistema Android iniciará automáticamente un hilo principal cuando se inicie el programa

Función: Procesar los cuatro componentes principales Cosas para interactuar con el usuario (como la interfaz de usuario, relacionadas con la interacción de la interfaz)

Debido a que el usuario interactuará con la interfaz en cualquier momento, el hilo principal debe mantener una alta velocidad de respuesta en todo momento, por lo que el hilo principal no puede realizar operaciones que requieren mucho tiempo; de lo contrario, se producirá ANR.

2.2.2 Subproceso secundario (subproceso de trabajo)

Definición: subproceso creado manualmente

Función: operaciones que requieren mucho tiempo (solicitudes de red, operaciones de E/S, etc.) .)

2.3 Diferencias y conexiones entre subprocesos demonio y no demonio

Diferencia: si la máquina virtual ha salido, es decir

Cuando todo. los subprocesos del usuario finalizan En este momento, debido a que no hay necesidad de protección, el subproceso del demonio también finalizará y la máquina virtual también saldrá.

Por el contrario, siempre que algún subproceso del usuario esté todavía. ejecutándose, el hilo del demonio no terminará y la máquina virtual no saldrá

3. Prioridad del hilo

3.1 Representación

La prioridad del hilo se divide en 10 niveles , que están representados por constantes de clase Thread.

3.2 Configuración

Utilice el método setPriority(int grade) para establecer la prioridad. La prioridad del hilo predeterminada es 5, que es Thread.NORM_PRIORITY.

4. Estado del hilo

Estado de creación: cuando se utiliza el nuevo operador para crear un hilo

Estado listo: llamando al método de inicio, un hilo en el listo estado Es posible que el método de ejecución no se ejecute inmediatamente y aún debe esperar la programación de la CPU

Estado de ejecución: la CPU comienza a programar subprocesos y comienza a ejecutar el método de ejecución

Bloqueo (suspendido ) estado: el hilo entra en estado de bloqueo debido a algunas razones durante la ejecución, tales como: llamar al método de suspensión/espera, intentar obtener un bloqueo, etc.

Estado final (muerte): el método de ejecución completa la ejecución o encuentra una excepción

(1) La diferencia entre start() y run()

Inicie un hilo llamando al método start() de la clase Thread. momento, el hilo está en estado listo y no se está ejecutando. Se llama a la clase Thread para llamar al método run () para completar su operación de ejecución. El método run () se llama el cuerpo del hilo, que contiene el contenido del hilo que se ejecutará cuando finaliza la operación run (). termina y luego la CPU programa otro subproceso.

(2) La diferencia entre dormir (), esperar () y rendimiento ()

El método dormir () pertenece a la clase Thread y el método esperar () pertenece a la clase Objeto.

Cuando se llama al método sleep(), el hilo no liberará el bloqueo del objeto, solo suspenderá la ejecución durante el tiempo especificado y reanudará automáticamente el estado de ejecución cuando se llame al método wait(); el hilo abandonará el bloqueo del objeto y entrará en el proceso de espera de este objeto. Mientras espera el grupo de bloqueo, sin llamar al método notify (), el hilo siempre estará en el estado listo (suspendido).

Yield() salta directamente del estado de ejecución al estado listo, lo que indica que el hilo cede, abandona la CPU y permite que el programador de la CPU lo reprograme. La cortesía puede tener éxito o no, es decir, regresar al programador y competir de manera justa con otros subprocesos.

1. Principios de los subprocesos de Android

(1) ¿Por qué no puedes realizar operaciones que consumen mucho tiempo en el subproceso principal?

Para evitar ANR, debes No se pueden realizar operaciones que consumen mucho tiempo en el hilo principal de la interfaz de usuario, por lo que podemos colocar las operaciones que consumen mucho tiempo en otro hilo de trabajo. Una vez completada la operación, se notifica al hilo principal de la interfaz de usuario para que responda en consecuencia. Esto requiere dominar el método de comunicación entre subprocesos. Android proporciona dos métodos de comunicación entre subprocesos: uno es el mecanismo AsyncTask y el otro es el mecanismo Handler.

(2) ¿Por qué no se puede actualizar la interfaz de usuario en un hilo que no sea de interfaz de usuario? Debido a que el hilo de la interfaz de usuario de Android no es seguro para subprocesos, cuando una aplicación actualiza la interfaz de usuario, llama al método invalidate() para vuelva a dibujar la interfaz e invalidate() El método no es seguro para subprocesos, lo que significa que cuando actualizamos la interfaz de usuario en un subproceso que no es de la interfaz de usuario, puede haber otros subprocesos o subprocesos de la interfaz de usuario que también estén actualizando la interfaz de usuario, lo que provocará la La actualización de la interfaz no está sincronizada. Por lo tanto, no podemos actualizar la interfaz de usuario en un hilo principal que no sea la interfaz de usuario.

2. Varias formas de implementar subprocesos múltiples en Android

3. Por qué es necesario el subproceso múltiple

La esencia del subproceso múltiple es el procesamiento asincrónico. Para decirlo intuitivamente, no es necesario hacer que los usuarios se sientan "muy estancados".

4. ¿Cuál es el núcleo del mecanismo de subprocesos múltiples?

El mecanismo central de subprocesos múltiples es Handler.

Video explicativo del controlador recomendado: ¿Siempre te preguntan? ¿Sobre Handler en las entrevistas? Lo llevaré a interpretar el mecanismo central de Handler desde la perspectiva del código fuente

Basado en los problemas de múltiples procesos, múltiples subprocesos y Handler mencionados anteriormente, he compilado un conjunto de documentos de aprendizaje sobre el análisis. de los mecanismos Binder y Handler para que todos puedan aprender. Como referencia, si la necesita, puede hacer clic aquí para obtenerla directamente. ! ! Registra muchos puntos de conocimiento de aprendizaje relacionados con Android.