关于java线程池<二>
2013-06-13 10:17
190 查看
2013/06/13
在查看jdk中的线程池时,在jdk中我还看到了另外一个线程池,其接口定义为com.sun.corba.se.spi.orbutil.threadpool.ThreadPool,具体实现为com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl。corba包之前没有用到过。上网查阅之后知道corba主要是一种中间件技术规范,包括了对象请求代理(Object
Request Broker)的所有标准接口。这个因为跟这次的主题不太搭边,就略过了,有兴趣的同学可以自己上网查阅一下。我仔细的看了一下他的ThreadPool接口定义及实现,与之前我写的例子之间,主要多出的功能有:
1.很多用于统计的接口,例如 numberOfWorkQueues(),统计线程池服务的工作队列个数;minimumNumberOfThreads(),最小线程个数;maximumNumberOfThreads(),最大线程个数;
2.线程空闲的存活时间(以毫秒计数),一旦一个线程在等待工作的时间超过了设定的空闲存活时间(inactivityTimeout),则根据当前线程数是否等于最小线程数判断是否需要将此线程退出线程池。这部分的具体实现主要在WorkQueueImpl中(requestWork方法),异常的捕获处理在ThreadPoolImpl的内部类WorkerThread(继承至Thread)中(run方法)这里附上代码:
3.层级关系的对象监视器。对线程池的状态进行监控,可以实时通过com.sun.corba.se.spi.monitoring.MonitoredAttribute.MonitoredObject接口 getAttribute(String),来实时获取当前线程池的状态,包括当前线程数,当前空闲线程数,当前工作线程数等等。根据MonitoredObject接口的注释,这个监控系统应该是ORB的一个组件,这里不做研究。
上面的这个线程池实现是比较基础的,如果有自己的需求,可以参考上面这个实现。
下面主要看看jdk线程池的实现,下章见~
在查看jdk中的线程池时,在jdk中我还看到了另外一个线程池,其接口定义为com.sun.corba.se.spi.orbutil.threadpool.ThreadPool,具体实现为com.sun.corba.se.impl.orbutil.threadpool.ThreadPoolImpl。corba包之前没有用到过。上网查阅之后知道corba主要是一种中间件技术规范,包括了对象请求代理(Object
Request Broker)的所有标准接口。这个因为跟这次的主题不太搭边,就略过了,有兴趣的同学可以自己上网查阅一下。我仔细的看了一下他的ThreadPool接口定义及实现,与之前我写的例子之间,主要多出的功能有:
1.很多用于统计的接口,例如 numberOfWorkQueues(),统计线程池服务的工作队列个数;minimumNumberOfThreads(),最小线程个数;maximumNumberOfThreads(),最大线程个数;
2.线程空闲的存活时间(以毫秒计数),一旦一个线程在等待工作的时间超过了设定的空闲存活时间(inactivityTimeout),则根据当前线程数是否等于最小线程数判断是否需要将此线程退出线程池。这部分的具体实现主要在WorkQueueImpl中(requestWork方法),异常的捕获处理在ThreadPoolImpl的内部类WorkerThread(继承至Thread)中(run方法)这里附上代码:
Work requestWork(long waitTime) throws TimeoutException, InterruptedException { Work workItem; synchronized (this) { if (theWorkQueue.size() != 0) { workItem = (Work)theWorkQueue.removeFirst(); totalTimeInQueue += System.currentTimeMillis() - workItem.getEnqueueTime();//这里主要是统计数据的记录:记录所有任务在队列中的等待时间 workItemsDequeued++; return workItem; } try { long remainingWaitTime = waitTime;//从ThreadPoolImpl中传入的线程空闲存活时间 long finishTime = System.currentTimeMillis() + waitTime; do { this.wait(remainingWaitTime);//在这里等待,如果有其他线程唤醒,则竞争资源(工作所处队列),得到资源后继续执行,否则等待时间耗尽继续执行 if (theWorkQueue.size() != 0) { workItem = (Work)theWorkQueue.removeFirst(); totalTimeInQueue += System.currentTimeMillis() - workItem.getEnqueueTime(); workItemsDequeued++; return workItem;//取得工作 } remainingWaitTime = finishTime - System.currentTimeMillis();//计算剩余时间 } while (remainingWaitTime > 0); throw new TimeoutException();//一旦剩余时间等于0则抛出TimeOutException异常,ThreadPoolImpl会捕获该异常,并进行处理 } catch (InterruptedException ie) { throw ie; } } }
catch (TimeoutException e) { // This thread timed out waiting for something to do. synchronized (lock) { availableWorkerThreads--; // This should for both bounded and unbounded case if (currentThreadCount > minWorkerThreads) { currentThreadCount--; // This thread can exit.线程在这里退出线程池 return; } else { // Go back to waiting on workQueue.如果当前线程数量等于最小线程数量,则放回线程池继续等待工作 continue; } }
3.层级关系的对象监视器。对线程池的状态进行监控,可以实时通过com.sun.corba.se.spi.monitoring.MonitoredAttribute.MonitoredObject接口 getAttribute(String),来实时获取当前线程池的状态,包括当前线程数,当前空闲线程数,当前工作线程数等等。根据MonitoredObject接口的注释,这个监控系统应该是ORB的一个组件,这里不做研究。
上面的这个线程池实现是比较基础的,如果有自己的需求,可以参考上面这个实现。
下面主要看看jdk线程池的实现,下章见~
相关文章推荐
- 关于java线程池<三>
- 关于java线程池<一>
- Unity手游之路<二>Java版服务端使用protostuff简化protobuf开发
- java redis demo关于List<Integer>,List<String>
- 黑马程序员_关于黑马java班入学测试技术分享<前5题>(一)
- java多线程<二>TCP/IP实现简单的多客户端聊天
- java中关于<<,>>,>>>
- <二>深入理解Threadlocal 关于内存泄漏的思考
- Java就业面试题大全<二>
- Java总结<二>
- 关于java中<T>问题
- 关于java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.Att
- SharePoint 2013 列表关于大数据的测试<二>
- JAVA处理时间<二>
- 关于java中<T>的用法
- Nop-关于FluentValidation与验证<二>
- java基础<二>
- java面试知识点<二>
- 程序员_Java基础<二>-面向对象中
- 关于对 java 泛型中T extendscompareable<? super T>理解