我们提供安全,免费的手游软件下载!
线程池采用了池化思想,能够有效的管理线程的生命周期,减少了每次获取资源的消耗,提高了资源的利用率。类似池化实现还有数据库连接池、HTTP连接池等。
线程池的好处包括减少了线程创建和销毁的开销、提高了响应速度以及使得线程更加方便管理。
线程池的常见使用场景包括量大处理时间较短的任务、需要限制线程数量时以及异步执行一批不需要立刻反馈结果的任务。
Executor框架为Java 5 引入,将传统线程的操控方法进行优化升级,使其针对不同场景更加的灵活、管理更加的方便,其核心jar包为java.util.concurrent,简称JUC。此外,很重要的一点,该框架还避免了this逃逸问题。
Executor框架主要包括三个部分:任务(Runnabale/Callable,可以被ThreadPoolExecutor或ScheduledThreadPoolExecutor执行)、执行(通过实现Executor接口的子接口ExecutorService去构造相对来说比较完整的线程池执行系统)、返回值(线程池的优势之一,通过实现Futrure接口的FutureTask类将异步执行的结果获取到)。
ThreadPoolExecutor是线程池实现类,是Executor框架最核心的类。主线程提交任务后,线程池会根据不同的策略执行多线程任务,然后通过返回的Futrure对象的get方法取出执行结果。
线程池的参数包括corePoolSize(核心线程数)、maximumPoolSize(最大线程数)、workQueue(当核心线程池已满时,队列可以用来暂存后边进来的任务)、keepAliveTime(线程数量大于核心线程数量时,线程闲置时间超过此值的线程会被回收掉,直至缩到核心线程数)、unit(keepAliveTime参数的时间单位)、threadFactory(线程工厂,executor创建线程时用到)以及handler(拒绝策略线程池已达到最大线程数,此时队列也满了,再有任务进来就会触发拒绝策略)。
线程池的拒绝策略包括AbortPolicy(拒绝任务并抛异常RejectedExecutionException)、CallerRunsPolicy(直接在调用线程中执行任务,影响性能)、DiscardPolicy(拒绝任务,不报异常,不做任何处理)以及DiscradOldestPolicy(拒绝掉最早的任务,执行最新的)。
线程池相关的内容有很多,该文章重在介绍,若要深究其中的某个元素,可以通过参考源码的方式,这样可以最直观的看到内部组成以及各个元素之间如何合作解决线程池的实现问题。
热门资讯