石头变软装置艺术:使用java.util.concurrent实现的线程池、消息队列功能-Java技术文档 ...
来源:百度文库 编辑:偶看新闻 时间:2024/04/30 06:38:04
昨天开始研究java.util.concurrent,是出于线程安全的知识懂得不多,对自己写的线程池没有信心,所以就用了包里专家写好的线程池。这个包的功能很强大。有兴趣的朋友可以搜索了解更多的内容。 今天刚写好了一段200行左右的代码,拿出来跟大家分享我的学习经验。初次实践,不足之处,望能得到高手的指点。功能说明:一个发送消息模块将消息发送到消息队列中,无需等待返回结果,发送模块继续执行其他任务。消息队列中的指令由线程池中的线程来处理。使用一个Queue来存放线程池溢出时的任务。TestDriver.java是一个驱动测试,sendMsg方法不间断的向ThreadPoolManager发送数据。显示代码打印01 public class TestDriver 02 { 03 ThreadPoolManager tpm = ThreadPoolManager.newInstance(); 04 05 public void sendMsg( String msg ) 06 { 07 tpm.addLogMsg( msg + "记录一条日志 " ); 08 } 09 10 public static void main( String[] args ) 11 { 12 for( int i = 0; i < 100; i++ ) 13 { 14 new TestDriver().sendMsg( Integer.toString( i ) ); 15 } 16 } 17 }
ThreadPoolManager类:是负责管理线程池的类。同时维护一个Queue和调度进程。 显示代码打印01 public class ThreadPoolManager 02 { 03 private static ThreadPoolManager tpm = new ThreadPoolManager(); 04 05 // 线程池维护线程的最少数量 06 private final static int CORE_POOL_SIZE = 4; 07 08 // 线程池维护线程的最大数量 09 private final static int MAX_POOL_SIZE = 10; 10 11 // 线程池维护线程所允许的空闲时间 12 private final static int KEEP_ALIVE_TIME = 0; 13 14 // 线程池所使用的缓冲队列大小 15 private final static int WORK_QUEUE_SIZE = 10; 16 17 // 消息缓冲队列 18 Queue msgQueue = new LinkedList(); 19 20 // 访问消息缓存的调度线程 21 final Runnable accessBufferThread = new Runnable() 22 { 23 public void run() 24 { 25 // 查看是否有待定请求,如果有,则创建一个新的AccessDBThread,并添加到线程池中 26 if( hasMoreAcquire() ) 27 { 28 String msg = ( String ) msgQueue.poll(); 29 Runnable task = new AccessDBThread( msg ); 30 threadPool.execute( task ); 31 } 32 } 33 }; 34 35 final RejectedExecutionHandler handler = new RejectedExecutionHandler() 36 { 37 public void rejectedExecution( Runnable r, ThreadPoolExecutor executor ) 38 { 39 System.out.println(((AccessDBThread )r).getMsg()+"消息放入队列中重新等待执行"); 40 msgQueue.offer((( AccessDBThread ) r ).getMsg() ); 41 } 42 }; 43 44 // 管理数据库访问的线程池 45 final ThreadPoolExecutor threadPool = new ThreadPoolExecutor( 46 CORE_POOL_SIZE, MAX_POOL_SIZE, KEEP_ALIVE_TIME, TimeUnit.SECONDS, 47 new ArrayBlockingQueue( WORK_QUEUE_SIZE ), this.handler ); 48 49 // 调度线程池 50 final ScheduledExecutorService scheduler = Executors 51 .newScheduledThreadPool( 1 ); 52 53 final ScheduledFuture taskHandler = scheduler.scheduleAtFixedRate( 54 accessBufferThread, 0, 1, TimeUnit.SECONDS ); 55 56 public static ThreadPoolManager newInstance() 57 { 58 return tpm; 59 } 60 61 private ThreadPoolManager(){} 62 63 private boolean hasMoreAcquire() 64 { 65 return !msgQueue.isEmpty(); 66 } 67 68 public void addLogMsg( String msg ) 69 { 70 Runnable task = new AccessDBThread( msg ); 71 threadPool.execute( task ); 72 } 73 } AccessDBThread类:线程池中工作的线程。 显示代码打印01 public class AccessDBThread implements Runnable 02 { 03 private String msg; 04 05 public String getMsg() 06 { 07 return msg; 08 } 09 10 public void setMsg( String msg ) 11 { 12 this.msg = msg; 13 } 14 15 public AccessDBThread(){ 16 super(); 17 } 18 19 public AccessDBThread(String msg){ 20 this.msg = msg; 21 } 22 23 public void run() 24 { 25 // 向数据库中添加Msg变量值 26 System.out.println("Added the message: "+msg+" into the Database"); 27 } 28 29 } 文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20071215/91938.html
ThreadPoolManager类:是负责管理线程池的类。同时维护一个Queue和调度进程。 显示代码打印01 public class ThreadPoolManager 02 { 03 private static ThreadPoolManager tpm = new ThreadPoolManager(); 04 05 // 线程池维护线程的最少数量 06 private final static int CORE_POOL_SIZE = 4; 07 08 // 线程池维护线程的最大数量 09 private final static int MAX_POOL_SIZE = 10; 10 11 // 线程池维护线程所允许的空闲时间 12 private final static int KEEP_ALIVE_TIME = 0; 13 14 // 线程池所使用的缓冲队列大小 15 private final static int WORK_QUEUE_SIZE = 10; 16 17 // 消息缓冲队列 18 Queue
在jsp中怎样使用java的import java.util.*;?
import java.util.Date.*
java.util.GregorianCalendar 是什么意思?
Java中的util是什么意思
java.util.Date =new java.util.Date();日期转换
stm.setDate(3,new java.sql.Date(new java.util.Date().getTime()));
java中的util和lang包中的类总体上有什么功能?
java中有一个util类,如何调用它的PointsSet类?
在jini1_2_1 版本中启动javaspace时 出现java.lang.NoClassDefFoundError: COM/odi/util/OSHashtable
怎么使用JAVA啊??
怎么使用 Java SDK
如何使用JAVA
如何使用java gel
怎么使用java虚拟机
java web start如何使用?
java 内存使用太小
JAVA编程工具怎么使用
java加载器如何使用
如何使用正确使用该Java代码?
java需要安装什么JAVA组件才能正常的使用??
java运行环境变量,如何使用批处理
java如何在XP系统上使用
三星sgh-e808怎样使用JAVA扩展?
请问怎么使用Jcreator编写java程序????