Una breve descripción de los hilos en Netty
1. Un EventLoopGroup contiene uno o más EventLoops. El bucle de eventos está vinculado a un hilo durante todo su ciclo de vida
3. Todos los eventos de E/S procesados por el bucle de eventos se procesarán en el hilo asociado con él
4 .A El canal solo se puede registrar en un EventLoop durante todo su ciclo de vida<
5. Un bucle de eventos se asignará a uno o más canales durante su ciclo de vida
I: En Netty, la implementación del Canal debe ser segura para subprocesos; en base a esto, podemos almacenar una referencia al Canal y enviar datos al punto final remoto cuando sea necesario.
Segundo: en nuestro desarrollo empresarial, no debemos colocar tareas de larga duración que consuman mucho tiempo en la cola de ejecución de EventLoop, porque bloqueará continuamente todas las demás tareas en el Canal correspondiente al hilo. Si necesitamos realizar llamadas de bloqueo u operaciones que requieren mucho tiempo, podemos usar un grupo de subprocesos dedicado para manejarlas.
Hay dos formas de hacer esto
1. Utilice su propio grupo de subprocesos en el método de devolución de llamada de ChannelHandler para realizar llamadas asincrónicas
2. Al agregar un ChannelHandler, pase el último método proporcionado por Netty a ChannelPipeline.
Esto también muestra que, de forma predeterminada, cuando se llama a addLast(handler), el método de devolución de llamada en ChannelHandler es ejecutado por el subproceso de E/S, y si se llama a ChannelPipeline addlast(EventExecutorGroup group, ChannelHandler... .handler); el método de devolución de llamada en ChannelHandler es ejecutado por el grupo de subprocesos en el parámetro.
Además, el futuro proporcionado por JDK solo puede verificar manualmente el resultado de la ejecución, y esta operación está bloqueando
Las mejoras de Netty en ChannelFuture permiten que ChannelFuture obtenga el resultado de la ejecución de la devolución de llamada; a través de ChannelFutueListener, eliminando así la operación de bloqueo de la inspección manual.
Pero al mismo tiempo, el método OperationComplete de ChannelFutureListener será ejecutado por el subproceso de E/S, así que tenga cuidado de no realizar operaciones que consuman mucho tiempo aquí.