java提供的原生线程池技术处理原理很清晰,故只要使用自己的原生线程池技术一般都能满足项目的需求。java提供了很好的线程池实现,比我们自己的实现要更加健壮以及高效,同时功能也更加强大,不建议自己编写。另外有同学可能用过spring的线程池,那么spring线程池和jdk原生线程池有啥区别吗?我们查看源码和官方api可以知道SpringFrameWork 的 ThreadPoolTaskExecutor 是辅助 JDK 的 ThreadPoolExecutor 的工具类,它将属性通过 JavaBeans 的命名规则提供出来,方便进行配置。也就是说spring的包装了一下jdk,其实底层都是jdk的线程池。如果项目中有spring框架,建议使用spring的线程池(毕竟和环境一起,线程池的生命周期可以让spring容器来管理,当然啦,也可以使用原生的jdk线程池),如果没有其他要求,建议使用原生jdk线程池。
阿里巴巴的编程规范建议也是有异曲同工之妙的说法:
【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。
说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
1、原生jdk线程池单例使用
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* 线程池管理(线程统一调度管理)
*/
public final class ThreadPoolManager {
private static ThreadPoolManager sThreadPoolManager = new ThreadPoolManager();
// 线程池维护线程的最少数量
private static final int SIZE_CORE_POOL = 15;
// 线程池维护线程的最大数量
private static final int SIZE_MAX_POOL = 15;
/*
* 线程池单例创建方法
*/
public static ThreadPoolManager newInstance() {
return sThreadPoolMana