Executors类是Java提供的一个线程池工厂,可以用来创建不同类型的线程池。根据不同的场景和需求,选择合适的线程池可以提高系统的性能和效率,避免出现线程创建过多或过少的问题。
Executors.newFixedThreadPool():
public static ExecutorService newFixedThreadPool(int nThreads) {return new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());}
固定线程池,传入核心线程数,核心线程数和最大线程数一致,线程不会被销毁
若任务超过线程数量,则加入等待队列
Executors.newCachedThreadPool():
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}
缓存线程池,没有核心线程数,线程数量没有上限,线程在空闲60秒后被销毁
若任务超过线程数量,则创建新线程
Executors.newScheduledThreadPool():
public class Executors {/...public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}/...
}public class ScheduledThreadPoolExecutor extends ThreadPoolExecutor {/...public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE,DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,new DelayedWorkQueue());}/...
}
调度线程池,传入核心线程数,线程数量没有上限,线程在空闲10毫秒后被销毁
调度线程池在使用上不同于其他三个:
public static void main(String[] args) {ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);// 延迟3秒后执行任务executor.schedule(runnable, 3, TimeUnit.SECONDS);// 延迟1秒后执行任务,然后每隔2秒执行一次executor.scheduleAtFixedRate(runnable, 1, 2, TimeUnit.SECONDS);// 关闭线程池executor.shutdown();}}
newSingleThreadExecutor():
public static ExecutorService newSingleThreadExecutor() {return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()));}
单线程池,只有固定一个线程的线程池
若任务超过线程数量,则加入等待队列
以下是一些使用场景:
对于IO密集型的任务,如网络通信、数据库操作等,通常使用Executors.newCachedThreadPool()或Executors.newFixedThreadPool()线程池,以便快速响应请求,保持高并发性能。
对于CPU密集型的任务,如图像处理、视频压缩等,通常使用Executors.newFixedThreadPool()线程池,以便控制线程数量,避免过多线程的创建和销毁对系统性能造成负面影响。
对于需要定时执行的任务,如定时清理缓存、定时备份数据等,通常使用Executors.newScheduledThreadPool()线程池,以便按照预定的时间执行任务,保证系统稳定性。
对于需要顺序执行的任务,如日志输出、数据采集等,通常使用单线程池Executors.newSingleThreadExecutor()线程池,以便保证任务的顺序执行,避免多线程之间的竞争和冲突。
需要注意的是,选择合适的线程池需要根据具体的场景和需求进行选择和配置,不同的线程池类型有不同的优缺点,需要根据具体情况进行选择和使用。同时,在使用线程池时,还需要注意任务的数量、执行时间、超时时间、队列大小等参数的设置,以充分发挥线程池的性能和效率。