2010-06-08 2 views
5

Класс SimpleThreadPool, поставляемый вместе с Quartz Scheduler, не имеет поведения FIFO. Я хочу удостовериться, что если я буду добавлять задания в планировщик, они будут рассмотрены в первом порядке. Есть ли для этого ThreadPool? Или есть ли другой способ достичь этого?Quartz scheduler theadpool

ответ

5

Вы могли бы добиться этого путем делегирования в ThreadPoolExecutor с очереди FIFO, следующим образом:

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 
} 

Вполне возможно, что активный подсчет исполняемых файлов не будет точно соответствовать точное количество задач, которые выполняются. Вам нужно будет добавить защелку и использовать beforeExecute, чтобы обеспечить , что задача запущена, если это необходимо.

+0

Это отличный пример, я попробую это. – Shamik

Смежные вопросы