public void execute(Runnable command) { if (command == null) throw new NullPointerException(); if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) { if (runState == RUNNING && workQueue.offer(command)) { if (runState != RUNNING || poolSize == 0) ensureQueuedTaskHandled(command); } else if (!addIfUnderMaximumPoolSize(command)) reject(command); // is shutdown or saturated } }
学习的过程首先是模仿的过程,然后才是创新,threadpoolExecutor是jdk自带的线程池,对比自己写的线程池,真是受益匪浅。
继承者 java.util.concurrent.AbstractExecutorService
继承者 java.util.concurrent.ThreadPoolExecutor
所有已实现的接口:
Executor, ExecutorService
直接已知子类:
ScheduledThreadPoolExecutor
它是ExecutorService的一个实现类,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。
线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括执行任务集时使用的线程)的方法。
每个 ThreadPoolExecutor 还维护着一些基本的统计数据,如完成的任务数。
为了便于跨大量上下文使用,此类提供了很多可调整的参数和扩展钩子 (hook)。
核心和最大池大小
ThreadPoolExecutor将根据corePoolSize(参见 getCorePoolSize())和 maximumPoolSize(参见 getMaximumPoolSize())
设置的边界自动调整池大小。当新任务在方法 execute(java.lang.Runnable) 中提交时,如果运行的线程少于 corePoolSize, 则创建新线程来处理请求,即使有线程是空闲的。
如果运行的线程多于 corePoolSize 而少于 maximumPoolSize,则仅当队列满时才创建新线程。
如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。
如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。
在大多数情况下,核心和最大池大小仅基于构造来设置,不过也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 进行动态更改。
ThreadPoolExecutor在java.util.concurrent中常用构造函数: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
corePoolSize:线程池中常驻线程的数量;
maximumPoolSize:线程池中所允许的最大的线程数。
keepAliveTime:线程池中允许非常驻线程没有任务的最大存活时间。
unit:时间单位。
workQueue:缓存队列,相当于一个桥。
一个任务就是通过execute方法加入到线程池中的,任务就是一个runnable的对象。 如果这个线程的数量大于线程池的量,且缓冲区未满,就加入到缓冲区中,如果缓冲区满了就创建新的进程。否则拒绝处理这个任务。
private Thread addThread(Runnable firstTask) { Worker w = new Worker(firstTask); Thread t = threadFactory.newThread(w); if (t != null) { w.thread = t; workers.add(w); int nt = ++poolSize; if (nt > largestPoolSize) largestPoolSize = nt; } return t; }
workers是一个hashset,方法主要是增加和返回他的第一个任务。
private boolean addIfUnderCorePoolSize(Runnable firstTask) { Thread t = null; final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { if (poolSize < corePoolSize && runState == RUNNING) t = addThread(firstTask); } finally { mainLock.unlock(); } if (t == null) return false; t.start(); return true; }
创建和开始一个新的线程,当线程数小于corepoolsize。
private boolean addIfUnderMaximumPoolSize(Runnable firstTask) { Thread t = null; final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { if (poolSize < maximumPoolSize && runState == RUNNING) t = addThread(firstTask); } finally { mainLock.unlock(); } if (t == null) return false; t.start(); return true; }
类似 ,不解释。
private final class Worker implements Runnable { /** * The runLock is acquired and released surrounding each task * execution. It mainly protects against interrupts that are * intended to cancel the worker thread from instead * interrupting the task being run. */ private final ReentrantLock runLock = new ReentrantLock(); /** * Initial task to run before entering run loop. Possibly null. */ private Runnable firstTask; /** * Per thread completed task counter; accumulated * into completedTaskCount upon termination. */ volatile long completedTasks; /** * Thread this worker is running in. Acts as a final field, * but cannot be set until thread is created. */ Thread thread; Worker(Runnable firstTask) { this.firstTask = firstTask; } boolean isActive() { return runLock.isLocked(); } /** * Interrupts thread if not running a task. */ void interruptIfIdle() { final ReentrantLock runLock = this.runLock; if (runLock.tryLock()) { try { if (thread != Thread.currentThread()) thread.interrupt(); } finally { runLock.unlock(); } } } /** * Interrupts thread even if running a task. */ void interruptNow() { thread.interrupt(); } /** * Runs a single task between before/after methods. */ private void runTask(Runnable task) { final ReentrantLock runLock = this.runLock; runLock.lock(); try { /* * Ensure that unless pool is stopping, this thread * does not have its interrupt set. This requires a * double-check of state in case the interrupt was * cleared concurrently with a shutdownNow -- if so, * the interrupt is re-enabled. */ if (runState < STOP && Thread.interrupted() && runState >= STOP) thread.interrupt(); /* * Track execution state to ensure that afterExecute * is called only if task completed or threw * exception. Otherwise, the caught runtime exception * will have been thrown by afterExecute itself, in * which case we don't want to call it again. */ boolean ran = false; beforeExecute(thread, task); try { task.run(); ran = true; afterExecute(task, null); ++completedTasks; } catch (RuntimeException ex) { if (!ran) afterExecute(task, ex); throw ex; } } finally { runLock.unlock(); } } /** * Main run loop */ public void run() { try { Runnable task = firstTask; firstTask = null; while (task != null || (task = getTask()) != null) { runTask(task); task = null; } } finally { workerDone(this); } } }
内部类:worker类,主要是来容纳任务的,相当于来执行一个线程。
分享到:
相关推荐
《JDK之ThreadPoolExecutor源码分析1》 在Java编程中,线程池是一种高效的管理线程的方式,它通过复用已存在的线程来避免频繁创建和销毁线程带来的开销。ThreadPoolExecutor作为Java中的线程池实现,其内部机制相当...
而线程池不允许使用Executors去创建,而要通过ThreadPoolExecutor方式,这一方面是由于jdk中Executor框架虽然提供了如newFixedThreadPool()、newSingleThreadExecutor()、newCachedThreadPool()等创建线程池的方法,...
介绍一个通用多线程服务模块。是利用jdk线程池,多线程并行处理多任务,以提高执行效率。
JDK 1.5引入了java.util.concurrent包,其中包含了线程池的实现,使得并发编程更加便捷和高效。线程池的核心在于它的设计策略,包括核心线程数、最大线程数、线程存活时间、工作队列以及拒绝策略。 线程池的主要类...
### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...
ThreadPoolExecutor 是 JDK 自带线程池的核心类,提供了线程池的管理和执行功能。该类提供了多种方法来创建和管理线程池,例如固定大小的线程池、单线程的线程池和计划线程池等。 创建线程池 创建线程池有多种方法...
JDK线程池可以通过ThreadPoolExecutor类来创建,ThreadPoolExecutor类提供了一个ExecutorService接口的实现。 在使用JDK线程池时,我们可以通过ThreadPoolExecutor类来创建一个线程池,例如: ```java private ...
然而,在实际开发中,通常推荐使用JDK提供的`ThreadPoolExecutor`类,因为它提供了更丰富的功能和更好的性能优化。如《Effective Java》第二版第47条建议,避免重复造轮子,使用成熟且经过优化的类库。
JDK1[1].5中的线程池(ThreadPoolExecutor)使用简介
这份"JDK8完整源码包"包含了JavaFX、Sun私有实现等核心组件的源代码,为深入理解Java平台的工作原理提供了宝贵的资源。 首先,JavaFX是Java的图形用户界面(GUI)库,自JDK 8起成为标准部分,它提供了丰富的UI组件...
JDK1.5中的线程池(ThreadPoolExecutor)使用简介
本文将围绕Tomcat的线程池源码进行深入剖析,旨在帮助读者理解其内部机制,并对比JDK的线程池,探讨其效率优势。 首先,我们需要了解线程池的基本原理。线程池是一种多线程处理形式,预先创建一定数量的线程,当...
《深入解析JDK 8u60源码》 JDK(Java Development Kit)是Java编程语言的核心组件,包含了编译器、运行时环境、工具集等,是开发者理解和使用Java技术的重要基石。JDK 8u60是Oracle公司发布的一个版本,包含了对...
"JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用" JDK1.5中的线程池(java.util.concurrent.ThreadPoolExecutor)使用是Java多线程编程中的一种重要概念。随着多线程编程的普及,线程池的使用变得...
资源很不错
1.媲美java线程池框架,整套源码资源,使用Intellij Idea开发工具,JDK1.8以上 2.带有测试代码 3.可以根据项目实际情况任意调整代码 4.任务队列、拒绝策略 5.BasicThreadPool.java、LinkedRunnableQueue.java、...
例如,`java.util.concurrent`包在并发编程中提供了高级工具,如线程池、锁和并发集合,通过源码可以学习到它们的内部工作机制。 3. **异常处理**:源码中展示了如何使用try-catch-finally结构来捕获和处理异常,...
corePoolSize: 线程池维护线程的最少数量 maximumPoolSize:线程池维护线程的最大数量 keepAliveTime: 线程池维护线程所允许的空闲时间 unit: 线程池维护线程所允许的空闲时间的单位 workQueue: 线程池所使用的...
jdk自带的线程池主要是通过ThreadPoolExecutor类来实现的。ThreadPoolExecutor类是Executor框架中最核心的类,它提供了一个灵活的线程池管理机制,允许开发者根据需要创建不同类型的线程池。 二、jdk自带线程池的...
Java同时jdk源码剖析任务控制 Mission Control 是一个开源的 Java 生产时间分析和诊断工具。 目前可以在受支持平台上的 Oracle JDK 和 Eclipse 市场中找到 Mission Control 的构建版本。 有关任务控制的更多信息,请...