Java线程池的几种实现方法和区别介绍
前言
多线程是计算机领域中的重要概念,能够有效的提高程序的运行效率。但是,高并发下多线程不规则创建和销毁会消耗系统大量的CPU和内存资源。因此,使用线程池技术能够有效的降低线程创建和销毁的开销,并且控制并发线程数,从而更好的管理服务器资源。
本文将详细介绍Java线程池的几种实现方法和区别,并且提供示例说明。
Java线程池的实现方法
Java线程池的实现主要包括以下几种方法:
1. newCachedThreadPool()
对于newCachedThreadPool()而言,这种线程池的实现没有固定大小,而是根据所需任务实时创建线程。当一个线程完成任务后,它会被回收到线程池中,以便下一个任务使用。当线程池没有空闲线程时,将创建一个新的线程以执行新的任务。
ExecutorService threadPool = Executors.newCachedThreadPool();
2. newFixedThreadPool(int nThreads)
newFixedThreadPool()方法创建的线程池有固定数目的线程,即当线程池中的所有线程都处于活动状态时,另外提交的任务将处于等待状态,如果有空闲线程,则立即执行。如果线程池中的线程已经全部使用,并且正在等待中的任务队列已满,则在调用的额外任务将会被阻塞,直到线程池中有新的空闲线程可使用。
ExecutorService threadPool = Executors.newFixedThreadPool(3);
3. newSingleThreadExecutor()
newSingleThreadExecutor()方法创建的是单个线程,它会保证所有的任务以先进先出的顺序逐一执行。在这个线程中,任何时候都只有一个任务被执行,即其他所有任务都将在队列中等待。
ExecutorService threadPool = Executors.newSingleThreadExecutor();
4. newScheduledThreadPool(int corePoolSize)
newScheduledThreadPool(int corePoolSize)方法创建的是一个可执行定时任务的线程池,它可以对一个定时周期性的任务进行调度执行,或者延迟执行一个任务。
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
Java线程池的区别
Java线程池的上述几种方法,它们之间的区别主要有以下几个方面:
- 对于newCachedThreadPool()方法而言,具有自动缩放的特点,适合于执行很多小的任务,而且在一段时间内,能够保持线程池的大小固定,节省线程构建和销毁的开销;
- 对于newFixedThreadPool(int nThreads)方法而言,它能够重用固定数目的线程,而且可以控制并发线程数,因而适合于执行长时间的任务;
- 对于newSingleThreadExecutor()方法而言,它能够保证任务执行的顺序,因而适合于需要按顺序执行的任务;
- 对于newScheduledThreadPool(int corePoolSize)方法而言,它能够管理延迟和定时任务的执行,因而适合于需要进行周期性任务调度和延迟任务执行的场景。
示例说明
示例1
public class ThreadPoolExample implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
ExecutorService threadPool = Executors.newFixedThreadPool(3);
for(int i=0;i<3;i++){
threadPool.execute(new ThreadPoolExample());
}
}
}
以上示例中通过创建一个实现了Runnable接口的ThreadPoolExample类,并在main函数中创建了一个固定大小为3的线程池。循环3次调用execute方法,将任务提交到线程池中,任务实际执行里面的run方法中。
示例2
public class ScheduledThreadPoolExample implements Runnable {
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
scheduledThreadPool.scheduleAtFixedRate(new ScheduledThreadPoolExample(), 1, 2, TimeUnit.SECONDS);
}
}
以上示例中通过创建一个实现了Runnable接口的ScheduledThreadPoolExample类,并在main函数中创建了一个核心线程数为3的定时任务线程池。由于使用了scheduleAtFixedRate方法,线程池会每隔2秒运行一次任务,直到调用了shutdown方法终止线程池。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程池的几种实现方法和区别介绍 - Python技术站