Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 719|回复: 0

使用java.util.concurrent实现的线程池、消息队列功能

[复制链接]

该用户从未签到

发表于 2011-8-5 23:52:23 | 显示全部楼层 |阅读模式
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 ) );
  }
  }
  }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-4-28 23:05 , Processed in 0.417662 second(s), 38 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表