您的位置  首页 >> 学习园地 >> JAVA技术 >> 正文
使用java.util.concurrent实现的线程池、消息队列功能
[来源:本站 | 日期:2011年12月27日 | 浏览1016 次] 字体:[ ]
ThreadPoolManager类:负责管理线程池,调用轮询的线程来访问字符串缓冲区的内容,维护缓冲区,当线程池溢出时抛出的Runnable任务被加入到字符缓冲区。

  public class ThreadPoolManager

  {

  private static ThreadPoolManager tpm = new ThreadPoolManager();

  // 线程池维护线程的最少数量

  private final static int CORE_POOL_SIZE = 4;

  // 线程池维护线程的最大数量

  private final static int MAX_POOL_SIZE = 10;

  // 线程池维护线程所允许的空闲时间

  private final static int KEEP_ALIVE_TIME = 0;

  // 线程池所使用的缓冲队列大小

  private final static int WORK_QUEUE_SIZE = 10;

  // 消息缓冲队列

  Queue msgQueue = new LinkedList();

  // 访问消息缓存的调度线程

  final Runnable accessBufferThread = new Runnable()

  {

  public void run()

  {

  // 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中

  if( hasMoreAcquire() )

  {

  String msg = ( String ) msgQueue.poll();

  Runnable task = new AccessDBThread( msg );

  threadPool.execute( task );

  }

  }

  };

  final RejectedExecutionHandler handler = new RejectedExecutionHandler()

  {

  public void rejectedExecution( Runnable r, ThreadPoolExecutor executor )

  {

  System.out.println(((AccessDBThread )r).getMsg()+"消息放入队列中重新等待执行");

  msgQueue.offer((( AccessDBThread ) r ).getMsg() );

  }

  };

  // 管理数据库访问的线程池

  final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(

  CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS,

  new ArrayBlockingQueue( WORK_QUEUE_SIZE ), this.handler );

  // 调度线程池

  final ScheduledExecutorService scheduler = Executors

  .newScheduledThreadPool( 1 );

  final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate(

  accessBufferThread, 0, 1, TimeUnit.SECONDS );

  public static ThreadPoolManager newInstance()

  {

  return tpm;

  }

  private ThreadPoolManager(){}

  private boolean hasMoreAcquire()

  {

  return !msgQueue.isEmpty();

  }

  public void addLogMsg( String msg )

  {

  Runnable task = new AccessDBThread( msg );

  threadPool.execute( task );

  }

  }

  public class AccessDBThread implements Runnable

  {

  private String msg;

  public String getMsg()

  {

  return msg;

  }

  public void setMsg( String msg )

  {

  this.msg = msg;

  }

  public AccessDBThread(){

  super();

  }

  public AccessDBThread(String msg){

  this.msg = msg;

  }

  public void run()

  {

  // 向数据库中添加Msg变量值

  System.out.println("Added the message: "+msg+" into the Database");

  }

  }

  public class TestDriver

  {

  ThreadPoolManager tpm = ThreadPoolManager.newInstance();

  public void sendMsg( String msg )

  {

  tpm.addLogMsg( msg + "记录一条日志 " );

  }

  public static void main( String[] args )

  {

  for( int i = 0; i < 100; i++ )

  {

  new TestDriver().sendMsg( Integer.toString( i ) );

  }

  }

  }


责任编辑:admin