2007-07-24

jdk5的线程池

关键字: 线程池 thread pool
接上篇 http://www.javaeye.com/post/339894 继续讨论线程池
jdk5也提供了线程池 而且非常简单

ExecutorService pool = Executors.newFixedThreadPool(4); //创建线程池 4个工作线程
		pool.execute(new RunnableTask()); //向任务队列添加任务,任务是一个Runnbale的实现类
		pool.shutdown();//停止工作线程

看一下 这两句
pool.execute(new RunnableTask()) //RunnableTask implements Runnable
//这句是在上篇文章中
pool.addTask(new SimpleTask(new MyManager(), i)) //SimpleTask implements Task 

看出什么不同了吗? jdk5实现的是Runnble接口 也就是说它的每个任务又是一个线程?是这样吗? 不是
让我们看看是怎么实现的吧
/**
         * Run a single task between before/after methods.
         */
        private void runTask(Runnable task) {
            final ReentrantLock runLock = this.runLock;
            runLock.lock();
            try {
                // Abort now if immediate cancel.  Otherwise, we have
                // committed to run this task.
                if (runState == STOP)
                    return;

                Thread.interrupted(); // clear interrupt status on entry
                boolean ran = false;
                beforeExecute(thread, task);
                try {
                    task.run();  //调用的是run()方法 而不是start()
                    ran = true;
                    afterExecute(task, null);
                    ++completedTasks;
                } catch(RuntimeException ex) {
                    if (!ran)
                        afterExecute(task, ex);
                    // Else the exception occurred within
                    // afterExecute itself in which case we don't
                    // want to call it again.
                    throw ex;
                }
            } finally {
                runLock.unlock();
            }
        }

请注意task.run(); 这句, 这儿并没有启动线程 而是简单的调用了一个普通对象的一个方法
runTask方法是在工作线程(Worker)中调用的
/**
     *  Worker threads
     */
private class Worker implements Runnable {
//只列出run方法 其他省略
 public void run() {
            try {
                Runnable task = firstTask;
                firstTask = null;
                while (task != null || (task = getTask()) != null) {
                    runTask(task);  //执行任务
                    task = null; // unnecessary but can help GC
                }
            } catch(InterruptedException ie) {
                // fall through
            } finally {
                workerDone(this);
            }
        }
}


jdk5的开发人员也真够省的,多创建一个任务接口多好理解啊, 非要用Runnable接口 误导我们。
以上的代码片段都节选自jdk5中ThreadPoolExecutor
评论
xly_971223 2007-07-25
liangguanhui 写道
1、jdk5的线程池部分好像不是sun自己开发的
2、其实很容易理解为什么直接用一个Runnable,我觉得作多一个接口反而不好。

我一看到Runnbale这个接口的时候 误认为是Thread,郁闷了好长时间才搞清除
liangguanhui 2007-07-25
1、jdk5的线程池部分好像不是sun自己开发的
2、其实很容易理解为什么直接用一个Runnable,我觉得作多一个接口反而不好。
xly_971223
搜索本博客
博客分类
我的相册
C5b0e206-307c-3f61-aa60-9cfd71c61bb3-thumb
u=3528569133,1587051000&gp=38.jpg
共 2 张
最近加入圈子
存档
最新评论