2010-06-08 10 views
5

La clase SimpleThreadPool incluida junto con Quartz Scheduler no tiene un comportamiento FIFO. Quiero asegurarme de que si continúo agregando trabajos al planificador, se los direccione primero en entrar, primero en salir. ¿Hay algún ThreadPool disponible para esto? ¿O hay alguna otra forma de lograr esto?Programador de cuarzo theadpool

Respuesta

5

Se podría lograr esto mediante la delegación a un ThreadPoolExecutor con una cola FIFO, de la siguiente manera:

public class DelegatingThreadPool implements ThreadPool { 

private int size = 5; //Fix this up if you like 
private final ThreadPoolExecutor executor = new ThreadPoolExecutor(size, size, 
            0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 

public boolean runInThread(Runnable runnable) { 
    synchronized (executor) { 
     if (executor.getActiveCount() == size) { 
      return false; 
     } 
     executor.submit(runnable); 
     return true; 
    } 
} 

public int blockForAvailableThreads() { 
    synchronized (executor) { 
     return executor.getActiveCount(); 
    } 
} 

public void initialize() throws SchedulerConfigException { 
    //noop 
} 

public void shutdown(boolean waitForJobsToComplete) { 
    //No impl provided for wait, write one if you like 
    executor.shutdownNow(); 
} 

public int getPoolSize() { 
    return size; 
} 

public void setInstanceId(String schedInstId) { 
    //Do what you like here 
} 

public void setInstanceName(String schedName) { 
    //Do what you like here 
} 

Es posible que la cuenta activa de los ejecutables no coincidirá exactamente con el número exacto de las tareas que se están ejecutando. Tendrá que agregar un pestillo y usar beforeExecute para asegurar que la tarea comenzó a ejecutarse si es necesario.

+0

Este es un gran ejemplo, intentaré esto. – Shamik

Cuestiones relacionadas