2010-06-08 24 views
5

Quartz Scheduler ile birlikte gönderilen SimpleThreadPool sınıfının bir FIFO davranışı yoktur. Zamanlayıcıya iş eklemeye devam edip etmediğime emin olmak istedim, ilk olarak İlk Giren İlke olarak ele alınıyorlar. Bunun için herhangi bir ThreadPool var mı? Ya da bunu başarmanın başka bir yolu var mı? aşağıdaki gibiQuartz scheduler theadpool

cevap

5

Sen, bir FIFO kuyruğuna sahip bir ThreadPoolExecutor için yetkisi vererek bunu elde edebiliriz:

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 
} 

Yürütülebilirlerin aktif sayımı tam yürütme görevleri sayısını tam uyuşmuyor olması mümkündür. Bir mandal eklemeniz ve gerekliyse, görevin olmasını sağlamak için beforeExecute özelliğini kullanmanız gerekir.

+0

Bu harika bir örnek, bunu deneyeceğim. – Shamik

İlgili konular