固定线程池和缓存线程池之间的区别。
javaserver side programmingprogramming
Executor 框架是使用线程池概念设计的。线程池是重用已创建的线程而不是每次都创建新线程来执行当前任务的方式。
Executors 类提供了一种工厂方法来创建线程池。ThreadPoolExecutor 类是从许多 Executors 工厂方法返回的执行器的基本实现。
Sr.否。 | 关键 | 固定线程池 | 缓存线程池 |
---|---|---|---|
1 | 基本 | 根据 Java 文档 − 创建一个线程池,该线程池重用固定数量的线程,这些线程在共享的无界队列上运行。在任何时候,最多 nThreads 个线程将处于活动状态并处理任务。如果在所有线程处于活动状态时提交了其他任务,它们将在队列中等待,直到有线程可用。如果任何线程在关闭之前的执行过程中由于故障而终止,则如果需要执行后续任务,将由新线程代替它。线程池中的线程将一直存在,直到明确关闭为止。 | 根据 Java Doc − 创建一个线程池,该线程池会根据需要创建新线程,但会在以前构建的线程可用时重用它们。这些线程池通常会提高执行许多短期异步任务的程序的性能。如果可用,对执行的调用将重用以前构建的线程。如果没有可用的现有线程,则会创建一个新线程并添加到池中。 |
2 | 队列 | 它使用阻塞队列。 | 它使用同步队列 队列。 |
3 | 线程生命周期 | 它将保持所有线程运行,直到它们被明确终止 | 六十秒内未使用的线程将被终止并从缓存中删除 |
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()); } }