返回信息流楼下回复推荐的这个博客,这里面说的很清楚 http://www.blogjava.net/xylz/archive/2011/01/18/343183.html
Thread启动的线程中 run方法包含一个循环,专门来处理接收到的任务,然后在里面启动任务的线程
(向线程池提交的任务是runnable或者 callable的,所以可以提交的任务也是个线程,然后可以启动)
不得不说,线程池的源码写的真是精妙,太棒了
--------------------------------------------------------------------------------------------
原问题:
java线程池,若为FixedThreadPool,若需要执行的线程数>线程池的大小,则大于线程池大小的任务放入阻塞队列等待,等线程池里面的某个线程执行完某任务以后 开始执行阻塞队列的任务。
想问这个执行新任务的线程是重新new了一个,还是使用原来的?
如果是使用原来的,一个线程不是只能启动一次吗?
看了一个小时源码,也没看懂。前几天面试面试官问到这个,当时就蒙了。
另外,测试中,线程池执行callable的任务时,打出Thread.currentThread().getName(),发现执行新任务的Thread名字还是以前那个名字
这是一条镜像帖。来源:北邮人论坛 / java / #40401同步于 2015/5/3
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
[问题]关于java线程池[已解决]
homeless271
2015/5/3镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
我也知道啊,但是一个线程不是只能启动一次吗?怎么做到不重新new,还能执行新任务的呢?
【 在 origin 的大作中提到: 】
: new是不是违背了线程池的初衷?
【 在 homeless271 的大作中提到: 】
: 我也知道啊,但是一个线程不是只能启动一次吗?怎么做到不重新new,还能执行新任务的呢?
:
觉得线程执行完任务后,并没有结束,所以也无需启动。
至于怎么实现的(可能是通过改变线程状态以及阻塞队列实现),我也没看过源代码[em2]
少年,看下源码吧,然后再讨论下。之前我和你的想法希望 被面试官问到了,挺囧的
【 在 origin 的大作中提到: 】
:
: 觉得线程执行完任务后,并没有结束,所以也无需启动。
: 至于怎么实现的(可能是通过改变线程状态以及阻塞队列实现),我也没看过源代码
来自「北邮人论坛手机版」
用的应该是原来那个。你可以看看源代码中 final void runWorker(Worker w)这个方法,在ThreadPoolExecutor class里面,中间的while循环好像就是循环的从队列中getTask然后来运行。
哦对,我是jdk1.8
【 在 homeless271 的大作中提到: 】
: java线程池,若为FixedThreadPool,若需要执行的线程数>线程池的大小,则大于线程池大小的任务放入阻塞队列等待,等线程池里面的某个线程执行完某任务以后 开始执行阻塞队列的任务。
: 想问这个执行新任务的线程是重新new了一个,还是使用原来的?
: 如果是使用原来的,一个线程不是只能启动一次吗?
: ...................
顺便推荐http://www.blogjava.net/xylz/archive/2011/01/18/343183.html
【 在 homeless271 的大作中提到: 】
: java线程池,若为FixedThreadPool,若需要执行的线程数>线程池的大小,则大于线程池大小的任务放入阻塞队列等待,等线程池里面的某个线程执行完某任务以后 开始执行阻塞队列的任务。
: 想问这个执行新任务的线程是重新new了一个,还是使用原来的?
: 如果是使用原来的,一个线程不是只能启动一次吗?
: ...................
这个人写的真清楚啊,谢谢~~万分感谢
【 在 aiquestion 的大作中提到: 】
: 顺便推荐http://www.blogjava.net/xylz/archive/2011/01/18/343183.html
:
而且这是一个系列的blog,对整个concurrent包都介绍了一下。
【 在 homeless271 的大作中提到: 】
: 这个人写的真清楚啊,谢谢~~万分感谢
:
【 在 homeless271 的大作中提到: 】
: 少年,看下源码吧,然后再讨论下。之前我和你的想法希望 被面试官问到了,挺囧的
: 来自「北邮人论坛手机版」
感觉你的认识是线程完成当前任务后会结束,而与线程池的设计思想和你的测试结果相违背。
是社招 还是校招啊?