2007-07-24
jdk5的线程池
关键字: 线程池 thread pool
接上篇 http://www.javaeye.com/post/339894 继续讨论线程池
jdk5也提供了线程池 而且非常简单
看一下 这两句
看出什么不同了吗? jdk5实现的是Runnble接口 也就是说它的每个任务又是一个线程?是这样吗? 不是
让我们看看是怎么实现的吧
请注意task.run(); 这句, 这儿并没有启动线程 而是简单的调用了一个普通对象的一个方法
runTask方法是在工作线程(Worker)中调用的
jdk5的开发人员也真够省的,多创建一个任务接口多好理解啊, 非要用Runnable接口 误导我们。
以上的代码片段都节选自jdk5中ThreadPoolExecutor
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,我觉得作多一个接口反而不好。
2、其实很容易理解为什么直接用一个Runnable,我觉得作多一个接口反而不好。
我一看到Runnbale这个接口的时候 误认为是Thread,郁闷了好长时间才搞清除
liangguanhui
2007-07-25
1、jdk5的线程池部分好像不是sun自己开发的
2、其实很容易理解为什么直接用一个Runnable,我觉得作多一个接口反而不好。
2、其实很容易理解为什么直接用一个Runnable,我觉得作多一个接口反而不好。
- 浏览: 88154 次
- 性别:

- 来自: 北京

- 详细资料
搜索本博客
我的相册
u=3528569133,1587051000&gp=38.jpg
共 2 张
共 2 张
最新评论
-
webwork ww:iterator 标签 ...
多谢!解决了一个问题~~
-- by huguohuan -
sso研究1-------跨域cook ...
你这不能算跨域,老大
-- by willfcareer2 -
刚上班一个月 遭遇新公司 ...
找工作的确不好受!现在想想找工作的那段时光都头大!
-- by ttxiangyou -
Js 事件冒泡
又受教了……不错,学习学习……
-- by xieboxin -
刚上班一个月 遭遇新公司 ...
够损,哈哈,加油~
-- by jizhuayazhua






评论排行榜