固定线程池和缓存线程池之间的区别。
执行器框架是使用线程池概念设计的。线程池是重用已经创建的线程的方法,而不是每次执行当前任务都创建一个新线程的方法。
Executors类提供了一种工厂方法来创建线程池。ThreadPoolExecutor类是从许多Executors工厂方法返回的执行器的基本实现。
序号 | 键 | 固定线程池 | 缓存线程池 |
---|---|---|---|
1 | 基本的 | 根据Java Doc- 创建一个线程池,该线程池重用在共享的无边界队列上运行的固定数量的线程。在任何时候,最多nThreads个线程都是活动的处理任务。如果在所有线程都处于活动状态时提交了其他任务,则它们将在队列中等待,直到某个线程可用为止。如果在关闭之前执行过程中由于执行失败导致任何线程终止,则在执行后续任务时将使用新线程代替。池中的线程将一直存在,直到明确将其关闭。 | 根据Java Doc- 创建一个线程池,该线程池可根据需要创建新线程,但在可用时将重用先前构造的线程。这些池通常将提高执行许多短暂的异步任务的程序的性能。如果可用,执行调用将重用以前构造的线程。如果没有可用的现有线程,则将创建一个新线程并将其添加到池中。 |
2 | 队列 | 它使用阻塞队列。 | 它使用SynchronousQueue 队列。 |
3 | 线程寿命 | 它将使所有线程一直运行,直到它们被明确终止 | 六十秒未使用的线程被终止并从缓存中删除 |
4。 | 线程池大小 | 线程池大小是固定的,因此不会增长。 | 线程池可以从零个线程增长到Integer.MAX_VALUE |
5, | 用例 | 当我们想限制并发任务时,我们应该使用fixedthreadpool | 当您有很多可预测的任务时,可以使用它。 |
固定线程池示例
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自动生成的捕获块
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自动生成的捕获块
e.printStackTrace();
}
latch.countDown();
System.out.println("Services2"+latch.getCount());
}
}
以上是 固定线程池和缓存线程池之间的区别。 的全部内容, 来源链接: utcz.com/z/335198.html