关于java线程池<二>

来源:互联网 发布:mac上的文献管理软件 编辑:程序博客网 时间:2024/04/30 00:18

 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方法)这里附上代码:

 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 caseif (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线程池的实现,下章见~













原创粉丝点击