Introducción
Antes de aprender sobre los subprocesos de Java, miremos hacia el futuro cercano. Imagine que envió su currículum y tuvo una entrevista. Usted y un par de docenas de futuros colegas han sido invitados a trabajar en una gran empresa de software. Entre otras molestias, es necesario presentar documentos en papel para el empleo a un empleado de recursos humanos cansado.
Para agilizar el proceso, los aspirantes al puesto se pueden dividir en dos grupos y distribuir entre dos responsables de RRHH (si los hay en la empresa). Como resultado, aceleramos el proceso gracias al trabajo
de diseño paralelo .
Si solo hay un oficial de personal en la empresa, entonces tendrá que salir de alguna manera. Por ejemplo, puede volver a dividir a todos en dos grupos, por ejemplo, entrevistar a niñas y niños por turno.
O según otro principio: como hay más personas en el grupo inferior, alternaremos dos chicas por un chico.
Esta forma de organizar el trabajo se llama
multiproceso . Nuestro cansado oficial de recursos humanos cambia a diferentes grupos para reclutar al siguiente empleado de ellos. Hay quizás once grupos y cuatro oficiales de personal. En este caso,
el procesamiento de subprocesos múltiples se realizará en paralelo por parte de varios RR.HH., quienes pueden seleccionar a la siguiente persona de cualquier grupo para procesar sus documentos.
Procesos
El proceso (
proceso ) en este caso será la organización del trabajo de recepción de documentos. En una organización se pueden distinguir varios procesos: contabilidad, desarrollo de software, reuniones con clientes, operaciones de almacén, etc. Para cada proceso se asignan recursos: locales, empleados para su ejecución. Los procesos están aislados unos de otros: los responsables de recursos humanos no tienen acceso a la base de datos contable y los responsables de atención al cliente no corren por el almacén. Si un proceso necesita acceder a los recursos de otra persona, es necesario establecer comunicación entre procesos: memorandos, reuniones conjuntas.
Corrientes
El trabajo en un proceso se organiza en hilos (
java thread
). Para el departamento de RRHH, el flujo es la organización del trabajo para servir a un grupo. En la primera imagen hay un flujo, en las tres siguientes hay dos. Dentro del proceso, se pueden ejecutar subprocesos en paralelo: dos responsables de recursos humanos aceptan dos o más grupos de futuros empleados. La interacción de los oficiales de personal con los grupos (el procesamiento de subprocesos dentro de un proceso) se denomina
sincronización de subprocesos . Los dibujos del diseño de dos grupos por parte de un oficial de personal muestran métodos: uniforme (niña - niño - niña - niño) y con diferentes prioridades (dos niñas se alternan con un niño). Los hilos tienen acceso a los recursos del proceso al que pertenecen: los grupos del responsable de recursos humanos reciben muestras de formularios de solicitud y bolígrafos para completar documentos. Pero si los flujos interactúan con cosas que les son comunes, entonces es posible que se produzcan incidentes. Si el oficial de personal le pide que grite el nombre de la última persona en la cola, entonces, en el caso de dos grupos, no está seguro de antemano si escuchará el nombre de una mujer o de un hombre. Estos conflictos de acceso a datos, bloqueos y formas de resolverlos son un tema muy importante.
Estados de flujo
Cada hilo se encuentra en uno de los siguientes estados:
- Creado (
New
): la fila para el oficial de recursos humanos se está preparando, la gente se está organizando.
- Lanzado (
Runnable
): nuestra cola se ha alineado para el oficial de recursos humanos y está siendo procesada.
- Bloqueado (
Blocked
): el último chico de la cola intenta gritar un nombre, pero cuando escuchó que la chica del siguiente grupo empezó a hacerlo antes que él, se quedó en silencio.
- Completado (
Terminated
): el oficial de recursos humanos ha completado toda la cola y no es necesario.
- Esperando (
Waiting
): una cola está esperando una señal de otra.
La organización de subprocesos y su interacción es la base para el funcionamiento eficaz de los procesos.
Volvamos al mundo TI
En el siglo XXI, la ejecución paralela y multiproceso se ha vuelto relevante. Desde los años 90 del siglo pasado, los sistemas operativos multitarea Windows, MacOS y Linux se han consolidado firmemente en los ordenadores domésticos. A menudo puedes encontrar cuatro o más procesadores centrales en ellos. El número de bloques paralelos de tarjetas de video GPU ya superó los mil. Los programas populares se escriben teniendo en cuenta el subproceso múltiple (multiproceso), por ejemplo, versiones modernas de software para procesar gráficos, videos u operar con grandes cantidades de datos: Adobe Photoshop, WinRar, Mathematica, juegos modernos. El multiproceso de Java es un tema muy importante, popular y complejo. Por eso, en el curso de JavaRush hay muchas tareas para entenderlo muy bien. Los ejemplos de Java sobre subprocesos múltiples le ayudarán a dominar los matices y sutilezas básicos de esta área, sincronizando el trabajo de los subprocesos.
Proceso
Un proceso es una instancia en ejecución de un programa al que el sistema operativo (SO) ha asignado memoria, tiempo/núcleos de procesador y otros recursos. Es importante que la memoria se asigne por separado; los espacios de direcciones de diferentes procesos no son accesibles entre sí. Si los procesos necesitan comunicarse, pueden hacerlo mediante archivos, canalizaciones y otros métodos de comunicación entre procesos.
Fluir
Java
Thread
(corriente). A veces, para evitar confusiones con otras clases de Java
Stream
y similares, los subprocesos de Java suelen traducirse como subprocesos. Utilizan los recursos asignados a un proceso y son la forma en que se ejecuta el proceso. El hilo principal ejecuta el método
main
y sale. Cuando se ejecuta un proceso, se pueden generar subprocesos adicionales (subprocesos secundarios). Los hilos del mismo proceso pueden intercambiar datos entre sí. El multiproceso de Java requiere que se tenga en cuenta la sincronización de datos, no lo olvides. En Java, un proceso termina cuando finaliza su último hilo. Para tareas en segundo plano, un subproceso se puede iniciar como un demonio (
daemon
), la diferencia con uno normal es que se terminarán por la fuerza cuando
daemon
finalicen todos los que no sean subprocesos del proceso.
Primera aplicación multiproceso
Hay más de media docena de formas de crear subprocesos; en el curso de JavaRush las examinaremos en detalle. Primero, familiaricémonos con uno de los básicos. Hay una clase especial
Thread
en cuyo método
run()
es necesario escribir código que implemente la lógica del programa. Después de crear un hilo, puede iniciarlo llamando al archivo
start()
. Escribamos un programa de demostración que implemente un ejemplo de subprocesos múltiples de Java.
class PeopleQueue extends Thread {
private String[] names;
PeopleQueue(String... names) {
this.names = names;
}
@Override
public void run() {
for (int i = 0; i < names.length; i++) {
System.out.println("Обработаны documentoы: " + names[i]);
try {
sleep(500);
} catch (Exception e) {}
}
}
}
public class HR {
public static void main(String[] args) {
PeopleQueue queue1 = new PeopleQueue("Iván","Сергей","Николай","Фердинанд","Albahaca");
PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","olga");
System.out.println("Начали!");
queue1.start();
queue2.start();
}
}
Iniciemos el programa. La consola muestra el mensaje resultante del hilo principal. A continuación, cada hilo secundario
queue1
envía
queue2
a su vez mensajes a su consola común sobre el siguiente empleado procesado. Una de las posibles opciones para el programa:
Начали!
Обработаны documentoы: Мария
Обработаны documentoы: Iván
Обработаны documentoы: Людмила
Обработаны documentoы: Сергей
Обработаны documentoы: Алиса
Обработаны documentoы: Николай
Обработаны documentoы: Карина
Обработаны documentoы: Фердинанд
Обработаны documentoы: Ольга
Обработаны documentoы: Васoй
Process finished with exit code 0
El multiproceso en Java es un tema complejo y multifacético. La capacidad de escribir código utilizando computación paralela, multitarea y multiproceso lo ayudará a implementar tareas de manera efectiva en procesadores multinúcleo modernos y en clústeres que constan de muchas computadoras.
GO TO FULL VERSION