Package com.google.code.yanf4j.core.impl

Source Code of com.google.code.yanf4j.core.impl.PoolDispatcher

/**
*Copyright [2009-2010] [dennis zhuang(killme2008@gmail.com)]
*Licensed under the Apache License, Version 2.0 (the "License");
*you may not use this file except in compliance with the License.
*You may obtain a copy of the License at
*             http://www.apache.org/licenses/LICENSE-2.0
*Unless required by applicable law or agreed to in writing,
*software distributed under the License is distributed on an "AS IS" BASIS,
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
*either express or implied. See the License for the specific language governing permissions and limitations under the License
*/
/**
*Copyright [2009-2010] [dennis zhuang(killme2008@gmail.com)]
*Licensed under the Apache License, Version 2.0 (the "License");
*you may not use this file except in compliance with the License.
*You may obtain a copy of the License at
*             http://www.apache.org/licenses/LICENSE-2.0
*Unless required by applicable law or agreed to in writing,
*software distributed under the License is distributed on an "AS IS" BASIS,
*WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
*either express or implied. See the License for the specific language governing permissions and limitations under the License
*/
package com.google.code.yanf4j.core.impl;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.google.code.yanf4j.core.Dispatcher;
import com.google.code.yanf4j.util.WorkerThreadFactory;

/**
*
*
*
* Pool dispatcher,wrap a threadpool.
*
* @author dennis
*
*/
public class PoolDispatcher implements Dispatcher {
  public static int POOL_QUEUE_SIZE_FACTOR = 1000;
  public static float MAX_POOL_SIZE_FACTOR = 1.25f;
  private ThreadPoolExecutor threadPool;

  public PoolDispatcher(int poolSize) {
    this(poolSize, 60, TimeUnit.SECONDS,
        new ThreadPoolExecutor.AbortPolicy(), "pool-dispatcher");
  }

  public PoolDispatcher(int poolSize, long keepAliveTime, TimeUnit unit,
      RejectedExecutionHandler rejectedExecutionHandler, String prefix) {
    this.threadPool = new ThreadPoolExecutor(poolSize,
        (int) (MAX_POOL_SIZE_FACTOR * poolSize), keepAliveTime, unit,
        new ArrayBlockingQueue<Runnable>(poolSize
            * POOL_QUEUE_SIZE_FACTOR), new WorkerThreadFactory(
            prefix));
    this.threadPool.setRejectedExecutionHandler(rejectedExecutionHandler);
  }

  public final void dispatch(Runnable r) {
    if (!this.threadPool.isShutdown()) {
      this.threadPool.execute(r);
    }
  }

  public void stop() {
    this.threadPool.shutdown();
    try {
      this.threadPool.awaitTermination(1000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
      Thread.currentThread().interrupt();
    }
  }

}
TOP

Related Classes of com.google.code.yanf4j.core.impl.PoolDispatcher

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.