想起一个小细节:
线程池 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();
}
以前一直没注意到这个细节.今天特意看一下. 仅仅如此...
分享到:
相关推荐
3. **缓存线程池**:`Executors.newCachedThreadPool()` 创建一个线程池,会根据需要创建新线程。如果线程池中有空闲线程,则会重用。如果所有线程都在执行任务,新任务将等待,直到有线程空闲。不推荐在Android中...
- **固定大小的线程池**:`newFixedThreadPool(int nThreads)`创建一个可重用的固定线程数量的线程池,这些线程按需创建,且可以重复使用。 ```java ExecutorService service = Executors.newFixedThreadPool(3);...
Java提供了一些预定义的线程池实现,如`Executors.newFixedThreadPool(int nThreads)`创建固定大小的线程池,`Executors.newSingleThreadExecutor()`创建单线程的线程池,`Executors.newCachedThreadPool()`创建一个...
- **Executors.newCachedThreadPool()**: 创建一个可缓存的线程池,当线程池为空时,会自动创建新线程,但空闲线程超过一定时间会被回收。 不同类型的线程池适用于不同的场景。例如,`newSingleThreadExecutor`适用...
2. 可缓存线程池(Executors.newCachedThreadPool()):可缓存线程池,先查看池中有没有以前建立的线程,如果有,就直接使用。如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型...
ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); ``` 3. **ScheduledThreadPoolExecutor**:支持定时及周期性任务执行。 ```java ScheduledExecutorService scheduledThreadPool = ...
Java提供了一些预定义的线程池创建方法,如`Executors.newFixedThreadPool()`和`Executors.newCachedThreadPool()`。 - **`newFixedThreadPool()`**: - 定义了一个固定大小的线程池,所有线程都会一直存活,除非...
多线程的实现是通过创建一个线程池来完成的,使用了`Executors.newCachedThreadPool()`方法,这是一个可扩展的线程池,可以创建新的线程来执行任务,同时会回收和重用线程。在这个场景中,它适合于下载任务,因为...
线程池会尽可能重用已存在的线程,如果没有可用线程,会新建线程,当线程空闲时间超过60秒,线程会被终止。 - **newScheduledThreadPool(int corePoolSize)**:创建一个定长的调度线程池,支持定时及周期性任务执行...
CachedThreadPool由`Executors.newCachedThreadPool()`创建,它没有核心线程,会根据需要动态创建新线程。当线程池中的线程都忙碌时,新任务会创建新的线程,但线程数量最多不超过`Integer.MAX_VALUE`。空闲线程会...
2. **可缓存线程池**:`Executors.newCachedThreadPool()` 创建的线程池会尽可能重用已存在的线程,如果没有可用线程,会创建新线程。线程池大小理论上可以无限大,但过多的线程可能会导致系统资源耗尽,适用于处理...
newCachedThreadPool 创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。调用 execute 将重用以前构造的线程...
它会尽可能重用已经存在的线程,如果线程池中没有可用线程,会立即新建一个线程。但是,如果线程在60秒内未被使用,它会被终止并从线程池中移除。这种线程池适合执行大量短期小任务,因为它可以快速响应并创建新线程...
3. **重用线程**:线程池中的线程可以重复使用,避免了线程创建和销毁的开销。 4. **线程复用**:多个任务可以共享线程,减少了线程间通信的复杂性。 5. **可扩展性**:可以自定义线程池策略,根据应用需求调整线程...
- **`Executors.newCachedThreadPool()`**:创建一个缓存线程池,根据需要创建新线程,但在先前构造的线程可用时重用它们。适用于执行很多短期异步任务的情况。 - **`newThreadPoolExecutor(10,20,5,TimeUnit....
而`Executors`工具类提供了一些预设的线程池工厂方法,如`newFixedThreadPool`、`newSingleThreadExecutor`、`newCachedThreadPool`和`newScheduledThreadPool`,适用于不同的应用场景。 在实际开发中,正确选择和...
- **线程重用**:当新的任务到来时,首先检查线程池是否有空闲的线程可以重用,若有则重用,否则创建新线程。 - **灵活调整**:线程池可以根据任务需求灵活调整线程数量,避免资源浪费。 - **适合短期任务**:...
Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...
2. 使用Executors工厂方法创建线程池,如newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool等。 3. 提交任务给线程池:使用ExecutorService的submit()或execute()方法。 4. 线程池的关闭:调用...
答案:可以使用Executors类的newFixedThreadPool()、newCachedThreadPool()等方法创建Java线程池。 知识点:Java线程池的创建、Executors类、新建线程池。 13. 问题:什么是Callable和Future? 答案:Callable是指...