固定线程池和缓存线程池的区别。
Executor 框架是使用线程池的概念设计的。线程池是一种重用已创建线程的方式,而不是每次执行当前任务时都创建一个新线程。
Executors 类提供了一个工厂方法来创建线程池。ThreadPoolExecutor 类是许多 Executors 工厂方法返回的执行器的基本实现。
| 序号 | 关键点 | 固定线程池 | 缓存线程池 |
|---|---|---|---|
| 1 | 基础 | 根据 Java 文档 - 创建一个线程池,该线程池重用固定数量的线程来处理共享的无界队列中的任务。在任何时候,最多 nThreads 个线程将处于活动状态以处理任务。如果在所有线程都处于活动状态时提交了其他任务,它们将等待在队列中,直到有线程可用。如果在关闭之前,任何线程由于执行期间的故障而终止,则如果需要执行后续任务,将会有一个新的线程取代它。池中的线程将一直存在,直到显式关闭。 | 根据 Java 文档 - 创建一个线程池,该线程池根据需要创建新线程,但在有可用线程时会重用先前构建的线程。这些池通常可以提高执行许多短暂的异步任务的程序的性能。对 execute 的调用将重用先前构建的线程(如果可用)。如果没有可用的现有线程,则将创建一个新线程并添加到池中。 |
| 2 | 队列 | 它使用阻塞队列。 | 它使用同步队列。 队列。 |
| 3 | 线程生命周期 | 它将使所有线程保持运行,直到它们被显式终止。 | 60 秒内未使用的线程将被终止并从缓存中删除。 |
| 4. | 线程池大小 | 线程池大小是固定的,因此不会增长。 | 线程池可以从零个线程增长到 Integer.MAX_VALUE。 |
| 5. | 使用场景 | 当我们想要限制并发任务时,应该使用固定线程池。 | 当您有很多可预测的任务时,可以使用它。 |
固定线程池示例
public class Main {
public static void main(String args[]) throws InterruptedException {
ExecutorService executors = Executors.newFixedThreadPool(4);
CountDownLatch latch= new CountDownLatch(2);
executors.submit(new Service1(latch));
executors.submit(new Service2(latch));
latch.await();
System.out.println("Done");
}
import java.util.concurrent.CountDownLatch;
public class Service1 implements Runnable {
CountDownLatch latch;
public Service1(CountDownLatch latch) {
super();
this.latch = latch;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2"+latch.getCount());
}
}
import java.util.concurrent.CountDownLatch;
public class Service2 implements Runnable {
CountDownLatch latch;
public Service2(CountDownLatch latch) {
super();
this.latch = latch;
}
@Override
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2"+latch.getCount());
}
}
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP