Estoy tratando de utilizar un ThreadPoolExecutor para programar tareas, pero se encuentra con algunos problemas con sus políticas. Este es el comportamiento indicado:política ThreadPoolExecutor
- Si se están ejecutando menos hilos corePoolSize, el Ejecutor siempre prefiere agregar un nuevo hilo en lugar de hacer cola.
- Si corePoolSize o más subprocesos se están ejecutando, el Ejecutor siempre prefiere poner en cola una solicitud en lugar de agregar un nuevo subproceso.
- Si no se puede poner en cola una solicitud, se crea un nuevo subproceso a menos que exceda el máximo dePoolsize, en cuyo caso, la tarea será rechazada.
El comportamiento que quiero es esto:
- mismo que el anterior
- Si se están ejecutando más de corePoolSize pero menos de hilos maximumPoolSize, prefiere la adición de un nuevo hilo sobre la puesta en cola, y el uso de un subproceso inactivo sobre agregar un nuevo hilo.
- mismo que el anterior
Básicamente no quiero ninguna tarea a ser rechazados; Quiero que estén en cola en una fila ilimitada. Pero sí quiero tener hasta el máximo de subprocesos de Poolsize. Si uso una cola ilimitada, nunca genera subprocesos después de que llegue a coreSize. Si uso una cola acotada, rechaza las tareas. ¿Hay alguna forma de evitar esto?
Lo que estoy pensando ahora es ejecutar el ThreadPoolExecutor en una Cola Sincrónica, pero sin cargar las tareas directamente en él, en lugar de alimentarlas a una LinkedBlockingQueue independiente no acotada. Luego, otro hilo se carga desde LinkedBlockingQueue en el Ejecutor, y si uno es rechazado, simplemente lo intenta de nuevo hasta que no sea rechazado. Sin embargo, esto parece una molestia y un poco complicado, ¿hay alguna manera más clara de hacerlo?
Vaya, lo que escribí no era exactamente lo que quería. Edité el original. –
Configuración de corePoolsize = maximumPoolSize de hecho está cerca, pero también estoy usando allowCoreThreadTimeOut (false) y prestartAllCoreThreads(). –