Executors.newCachedThreadPool 线程重用_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Executors.newCachedThreadPool 线程重用

Executors.newCachedThreadPool 线程重用

 2013/11/14 18:49:56  id.alex  程序员俱乐部  我要评论(0)
  • 摘要:想起一个小细节:线程池CachedThreadPool的说明.引用publicstaticExecutorServicenewCachedThreadPool()创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.............但这个与Thread类的start方法说明有些冲突多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。例如://T是一个Thread的实现类Tt=newT();t.start();t.start();会抛出java
  • 标签:thread 线程
想起一个小细节:

线程池 CachedThreadPool  的说明.
引用
public static ExecutorService newCachedThreadPool()
创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们.............


但这个与 Thread 类的 start 方法 说明有些冲突
class="java" name="code">
多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。 


例如:
// T 是一个 Thread 的实现类
T t = new T();
t.start();
t.start();


会抛出  java.lang.IllegalThreadStateException

但下面这样就没问题..
T t = new T();
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
newCachedThreadPool.submit(t);
newCachedThreadPool.submit(t);


猜测线程池其实不是直接调用了 t.start(), 后来也证明了猜测. 线程池有一个 defaultThreadFactory , 实际也是每次 new 出来一个新的线程.
ThreadFactory tf = Executors.defaultThreadFactory();
for (int i = 0; i < 10; i++) {
	Thread tft = tf.newThread(t);
	tft.start();
}


以前一直没注意到这个细节.今天特意看一下. 仅仅如此...


发表评论
用户名: 匿名