package org.playorm.nio.impl.libs;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.playorm.nio.api.libs.StartableRouterExecutor;
/**
*/
public class RoutingExecutor implements StartableRouterExecutor
{
private int queueSize = 300;
private long keepAliveTime = 5000;
private boolean isDaemon = true;
private String name;
private List<ThreadPoolExecutor> singleThreadedExecutors = new ArrayList<ThreadPoolExecutor>();
private MyThreadFactory threadFactory;
private int numThreads;
public RoutingExecutor(String name, int numThreads) {
this.name = name;
this.numThreads = numThreads;
}
public void start(Object chanMgrId) {
threadFactory = new MyThreadFactory(name, isDaemon);
for(int i = 0; i < numThreads; i++) {
ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(queueSize);
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 1,
keepAliveTime , TimeUnit.MILLISECONDS, queue, threadFactory);
singleThreadedExecutors.add(executor);
}
}
public void stop(Object chanMgrId) {
for(ThreadPoolExecutor exec : singleThreadedExecutors) {
exec.shutdownNow();
}
}
/**
* @see org.playorm.nio.api.libs.StartableExecutorService#containsThread(java.lang.Thread)
*/
public boolean containsThread(Thread t)
{
return threadFactory.containsThread(t);
}
@Override
public List<Executor> getExecutors() {
List<Executor> executors = new ArrayList<Executor>();
for(ThreadPoolExecutor exec: singleThreadedExecutors) {
executors.add(exec);
}
return executors;
}
}