`
id.alex
  • 浏览: 22969 次
社区版块
存档分类
最新评论

Executors.newCachedThreadPool 线程重用

    博客分类:
  • Java
阅读更多
想起一个小细节:

线程池 CachedThreadPool  的说明.
引用

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


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


例如:
// 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();
}


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


分享到:
评论

相关推荐

    android线程池项目

    3. **缓存线程池**:`Executors.newCachedThreadPool()` 创建一个线程池,会根据需要创建新线程。如果线程池中有空闲线程,则会重用。如果所有线程都在执行任务,新任务将等待,直到有线程空闲。不推荐在Android中...

    java多线程并发

    - **固定大小的线程池**:`newFixedThreadPool(int nThreads)`创建一个可重用的固定线程数量的线程池,这些线程按需创建,且可以重复使用。 ```java ExecutorService service = Executors.newFixedThreadPool(3);...

    ThreadPool2

    Java提供了一些预定义的线程池实现,如`Executors.newFixedThreadPool(int nThreads)`创建固定大小的线程池,`Executors.newSingleThreadExecutor()`创建单线程的线程池,`Executors.newCachedThreadPool()`创建一个...

    Java线程池技术详解

    - **Executors.newCachedThreadPool()**: 创建一个可缓存的线程池,当线程池为空时,会自动创建新线程,但空闲线程超过一定时间会被回收。 不同类型的线程池适用于不同的场景。例如,`newSingleThreadExecutor`适用...

    Java四种常用线程池的详细介绍

    2. 可缓存线程池(Executors.newCachedThreadPool()):可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型...

    java 线程池

    ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); ``` 3. **ScheduledThreadPoolExecutor**:支持定时及周期性任务执行。 ```java ScheduledExecutorService scheduledThreadPool = ...

    java并发编程学习笔记

    Java提供了一些预定义的线程池创建方法,如`Executors.newFixedThreadPool()`和`Executors.newCachedThreadPool()`。 - **`newFixedThreadPool()`**: - 定义了一个固定大小的线程池,所有线程都会一直存活,除非...

    java多线程断点续传.pdf

    多线程的实现是通过创建一个线程池来完成的,使用了`Executors.newCachedThreadPool()`方法,这是一个可扩展的线程池,可以创建新的线程来执行任务,同时会回收和重用线程。在这个场景中,它适合于下载任务,因为...

    Executor,Executors,ExecutorService比较.docx

    线程池会尽可能重用已存在的线程,如果没有可用线程,会新建线程,当线程空闲时间超过60秒,线程会被终止。 - **newScheduledThreadPool(int corePoolSize)**:创建一个定长的调度线程池,支持定时及周期性任务执行...

    Java中四种线程池的使用示例详解

    CachedThreadPool由`Executors.newCachedThreadPool()`创建,它没有核心线程,会根据需要动态创建新线程。当线程池中的线程都忙碌时,新任务会创建新的线程,但线程数量最多不超过`Integer.MAX_VALUE`。空闲线程会...

    Java常用线程池原理及使用方法解析

    2. **可缓存线程池**:`Executors.newCachedThreadPool()` 创建的线程池会尽可能重用已存在的线程,如果没有可用线程,会创建新线程。线程池大小理论上可以无限大,但过多的线程可能会导致系统资源耗尽,适用于处理...

    详谈Java几种线程池类型介绍及使用方法

    newCachedThreadPool 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程...

    Java线程池的几种实现方法和区别介绍实例详解

    它会尽可能重用已经存在的线程,如果线程池中没有可用线程,会立即新建一个线程。但是,如果线程在60秒内未被使用,它会被终止并从线程池中移除。这种线程池适合执行大量短期小任务,因为它可以快速响应并创建新线程...

    100行Java代码构建一个线程池[借鉴].pdf

    3. **重用线程**:线程池中的线程可以重复使用,避免了线程创建和销毁的开销。 4. **线程复用**:多个任务可以共享线程,减少了线程间通信的复杂性。 5. **可扩展性**:可以自定义线程池策略,根据应用需求调整线程...

    Java性能调优PPT

    - **`Executors.newCachedThreadPool()`**:创建一个缓存线程池,根据需要创建新线程,但在先前构造的线程可用时重用它们。适用于执行很多短期异步任务的情况。 - **`newThreadPoolExecutor(10,20,5,TimeUnit....

    ThreadPoolStudy.rar

    而`Executors`工具类提供了一些预设的线程池工厂方法,如`newFixedThreadPool`、`newSingleThreadExecutor`、`newCachedThreadPool`和`newScheduledThreadPool`,适用于不同的应用场景。 在实际开发中,正确选择和...

    线程学习.docx

    - **线程重用**:当新的任务到来时,首先检查线程池是否有空闲的线程可以重用,若有则重用,否则创建新线程。 - **灵活调整**:线程池可以根据任务需求灵活调整线程数量,避免资源浪费。 - **适合短期任务**:...

    线程池管理线程demo

    Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...

    java多线程学习-ftp上传

    2. 使用Executors工厂方法创建线程池,如newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等。 3. 提交任务给线程池:使用ExecutorService的submit()或execute()方法。 4. 线程池的关闭:调用...

    14个Java线程并发面试题和答案..pdf

    答案:可以使用Executors类的newFixedThreadPool()、newCachedThreadPool()等方法创建Java线程池。 知识点:Java线程池的创建、Executors类、新建线程池。 13. 问题:什么是Callable和Future? 答案:Callable是指...

Global site tag (gtag.js) - Google Analytics