content: package org.apache.solr.handler.component;
  
  import java.util.concurrent.CompletionService;
  import java.util.concurrent.Executor;
  import java.util.concurrent.ExecutorCompletionService;
  import java.util.concurrent.ExecutorService;
  import java.util.concurrent.LinkedBlockingQueue;
  import java.util.concurrent.ThreadPoolExecutor;
  import java.util.concurrent.TimeUnit;
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
  import com.alimama.mdrill.utils.UniqConfig;
  
  public class MergerServerThreads {
  	
  
  	protected static Logger log = LoggerFactory.getLogger(MergerServerThreads.class);
  
  	public static ExecutorService[] EXECUTE = new ExecutorService[UniqConfig.getMergerRequestMaxDepth()];
  	static {
  		for (int i = 0; i < EXECUTE.length; i++) {
  			EXECUTE[i] = new ThreadPoolExecutor(UniqConfig.getMergerRequestThreadsMin(i), UniqConfig.getMergerRequestThreadsMax(i),
                      300L, TimeUnit.SECONDS,
                      new LinkedBlockingQueue<Runnable>());
  		}
  	}
  	 
  	 static Executor commExecutor = new ThreadPoolExecutor(
  	          0,
  	          Integer.MAX_VALUE,
  	          300, TimeUnit.SECONDS, // terminate idle threads after 5 sec
  	          new LinkedBlockingQueue<Runnable>()  // directly hand off tasks
  	  );
  	
  	  public static class SingleThread{
  		  public CompletionService<ShardResponse> completionService ;
  		  public SingleThread(ExecutorService exe)
  		  {
  			  completionService=new ExecutorCompletionService<ShardResponse>(exe);
  		  }
  	  }
  	  
  	  public static CompletionService<ShardResponse> create(int i)
  	  {
  		  if(i<EXECUTE.length)
  		  {
  				 return new ExecutorCompletionService<ShardResponse>(EXECUTE[i]);
  		  }
  		  
  		  
  		return new ExecutorCompletionService<ShardResponse>(commExecutor);
  
  	  }
  	  
  }
  
  //
  //public class MergerServerThreads {
  //	
  //	
  //	/**
  //	 * 
  //	 * 
  //	  new ThreadPoolExecutor(
  //	          2,
  //	          Integer.MAX_VALUE,
  //	          300, TimeUnit.SECONDS, // terminate idle threads after 5 sec
  //	          new LinkedBlockingQueue<Runnable>()  // directly hand off tasks
  //	  );
  //	 
  //	 
  //	 * 
  //	 */
  //	
  //	 static Executor commExecutor =new ThreadPoolExecutor(5, 60,
  //             300L, TimeUnit.SECONDS,
  //             new LinkedBlockingQueue<Runnable>());
  //	
  //	  
  //	  public static CompletionService<ShardResponse> create(int i)
  //	  {
  //		return new ExecutorCompletionService<ShardResponse>(commExecutor);
  //	  }
  //	  
  //}
  