Detalles de uso del ejecutor del grupo de subprocesos
1. ThreadPoolExecutor ejecutor =new ThreadPoolExecutor(2, 10, 30, TimeUnit.SECONDS, new ArrayBlockingQueuelt; gt; ( 100));
2 . ThreadPoolExecutor executor2 =new ThreadPoolExecutor(2, 10, 30, TimeUnit.SECONDS, new LinkedBlockingDequelt; gt; ());
Conociendo el rol de cada parámetro, podemos usar el grupo de subprocesos. SEGUNDOS, nuevo LinkedBlockingDequelt; gt ());
Después de comprender la función de cada parámetro, comenzamos a construir un grupo de subprocesos que cumpla con las expectativas. Primero mire el JDK, obtendremos varios grupos de subprocesos predefinidos:
I. Grupos de subprocesos predefinidos
FixThreadPool
publicstaticExecutorServicenewFixedThreadPool(intnThreads){ returnnewThreadPoolExecutor (nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, newLinkedBlockingQueue());}
corePoolSize y MaximumPoolSize son iguales, es decir, sus subprocesos son todos subprocesos centrales. Sus subprocesos son todos subprocesos centrales, lo cual es la ventaja de un grupo de subprocesos de tamaño fijo;
keepAliveTime = 0 Este parámetro no es válido para subprocesos principales de forma predeterminada, y FixThreadPool son todos subprocesos principales;
workQueue es LinkedBlockingQueue (cola de bloqueo ilimitada) y el valor máximo de la cola es Integer.MAX_VALUE. Si la tasa de envío de tareas continúa siendo mayor que la velocidad de procesamiento de tareas, se bloqueará una gran cantidad de colas. Dado que la cola es grande, es probable que la política de rechazo se aplique antes de que se desborde la memoria. Esta es su deficiencia;
Las tareas de FixThreadPool se ejecutan fuera de orden;
Escenarios aplicables: se puede utilizar para el recorte instantáneo de picos de servicios web, pero debe prestar atención a cola causada por el recorte de picos a largo plazo.
CachedThreadPool
publicstaticExecutorServicenewCachedThreadPool(){returnnewThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, newSynchronousQueue() }
corePoolSize = 0, MaximumPoolSize = Integer.MAX_VALUE, es decir, casi no hay límite en el número de subprocesos;
keepAliveTime = 60 s, el subproceso finalizará automáticamente después de estar inactivo durante 60 s.
workQueue es una cola de sincronización SynchronousQueue. Esta cola es similar a un bastón. La entrada y salida de la cola deben realizarse al mismo tiempo. Debido a que los subprocesos creados por CachedThreadPool son infinitos, no habrá espera. la cola, por lo que se usa SynchronousQueue;
Escenarios aplicables: para procesar rápidamente una gran cantidad de tareas a corto plazo, como que NIO de Netty acepte solicitudes, puede usar CachedThreadPool.
SingleThreadExecutor
publicstaticExecutorServicenewSingleThreadExecutor(){returnnewFinalizableDelegatedExecutorService (newThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, newLinkedBlockingQueue()); }
¿Qué tal esto? ¿No es simplemente newFixedThreadPool (1)?) Eche un vistazo más de cerca, hay una capa adicional de encapsulación FinalizableDelegatedExecutorService. ¿Para qué sirve esta capa? Escriba una cúpula para explicar:
publicstaticvoidmain(String[? ] args) { ExecutorService fijoExecutorService = Executors.NewFixedThreadPool(1). newFixedThreadPool(1); ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) fixExecutorService; ExecutorService singleExecutorService = Executors.newSingleThreadExecutor() // Excepción de tiempo de ejecución java. .ClassCastException// ?ThreadPoolExecutor threadPoolExecutor2 = (ThreadPoolExecutor) singleExecutorService;}
Los resultados de la comparación muestran que FixThreadPool se puede convertir a ThreadPoolExecutor y configurar su grupo de subprocesos, mientras que SingleThreadExecutor está empaquetado y no se puede degradar con éxito. convertido. Por lo tanto, un SingleThreadExecutor no se puede modificar después de que se haya configurado para implementar un verdadero subproceso único.
ScheduledThreadPool
publicstaticScheduledExecutorServicenewScheduledThreadPool(intcorePoolSize){returnnewScheduledThreadPoolExecutor(corePoolSize);
newScheduledThreadPool llama al constructor de ScheduledThreadPoolExecutor, que hereda del ejecutor ThreadPoolEx, y el constructor The Todavía se está llamando al constructor de su clase padre.
publicScheduledThreadPoolExecutor
publicScheduledThreadPoolExecutor(intcorePoolSize){super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, newDelayedWorkQueue() }
2. Grupo de subprocesos personalizado
1.