Java基础高级进阶篇之线程池详解

Java基础高级进阶篇之线程池详解
Java 线程池(ThreadPool)知识点详解本文基于 JDK 源码,深入分析线程池核心实现原理,配合完整可运行代码示例。目录Executor 接口体系源码分析ThreadPoolExecutor 核心源码深度剖析七大核心参数详解与实战任务执行流程源码级分析内置线程池源码与陷阱分析线程池生命周期与关闭机制扩展监控与自定义线程池Future 与 CompletableFuture 深度集成ForkJoinPool 工作窃取机制实际应用场景完整案例线程池参数调优与最佳实践常见问题排查指南一、Executor 接口体系源码分析1.1 Executor — 顶级接口packagejava.util.concurrent;publicinterfaceExecutor{/** * 在将来某个时间执行给定的命令。 * 该命令可能在新线程、池线程或调用线程中执行。 */voidexecute(Runnablecommand);}源码要点:只有一个方法execute(),是最顶层的抽象将"任务提交"与"任务执行"解耦不关心在哪个线程执行、是否异步执行1.2 ExecutorService — 核心服务接口publicinterfaceExecutorServiceextendsExecutor{// ===== 关闭方法 =====voidshutdown();// 平缓关闭ListRunnableshutdownNow();// 立即关闭,返回未执行任务booleanisShutdown();// 是否已关闭booleanisTerminated();// 是否已终止booleanawaitTermination(longtimeout,TimeUnitunit)// 等待终止throwsInterruptedException;// ===== 提交任务 =====TFutureTsubmit(CallableTtask);// 提交有返回值任务Future?submit(Runnabletask);// 提交无返回值任务TFutureTsubmit(Runnabletask,Tresult);// 提交任务并指定返回值// ===== 批量执行 =====TListFutureTinvokeAll(// 执行所有任务,等待全部完成Collection?extendsCallableTtasks)throwsInterruptedException;TTinvokeAny(// 执行任务,返回第一个完成的结果Collection?extendsCallableTtasks)throwsInterruptedException,ExecutionException;}源码要点:继承Executor,增加了生命周期管理和 Future 返回submit()方法将Runnable/Callable包装为FutureTaskinvokeAll()阻塞等待所有任务完成invokeAny()任意一个完成即返回(短路逻辑)1.3 AbstractExecutorService — 模板实现publicabstractclassAbstractExecutorServiceimplementsExecutorService{// submit 的默认实现:包装为 FutureTaskpublicFuture?submit(Runnabletask){if(task==null)thrownewNullPointerException();RunnableFutureVoidftask=newTaskFor(task,null);execute(ftask);// 委托给子类的 execute()returnftask;}publicTFutureTsubmit(CallableTtask){if(task==null)thrownewNullPointerException();RunnableFutureTftask=newTaskFor(task);execute(ftask);returnftask;}// 创建 FutureTask 的工厂方法protectedTRunnableFutureTnewTaskFor(Runnablerunnable,Tvalue){returnnewFutureTaskT(runnable,value);}protectedTRunnableFutureTnewTaskFor(CallableTcallable){returnnewFutureTaskT(callable);}// invokeAll 实现:逐个提交,等待全部完成publicTListFutureTinvokeAll(Collection?extendsCallableTtasks)throwsInterruptedException{// ... 省略部分代码ListFutureTfutures=newArrayList(tasks.size());for(CallableTt:tasks){RunnableFutureTf=newTaskFor(t);futures.add(f);execute(f);// 逐个提交执行}// 等待所有任务完成for(FutureTf:futures){if(!f.isDone()){try{f.get();}catch(...){}}}returnfutures;}}源码要点:submit()内部调用newTaskFor()创建FutureTask,再调用execute()模板方法模式:execute()由子类(ThreadPoolExecutor)实现invokeAll()逐个提交后阻塞等待全部完成二、ThreadPoolExecutor 核心源码深度剖析2.1 核心字段publicclassThreadPoolExecutorextendsAbstractExecutorService{// ===== 状态控制 =====// 高3位:线程池状态;低29位:工作线程数privatefinalAtomicIntegerctl=newAtomicInteger(ctlOf(RUNNING,0));privatestaticfinalintCOUNT_BITS=Integer.SIZE-3;// 29privatestaticfinalintCAPACITY=(1COUNT_BITS)-1;// 2^29 - 1// 5种运行状态(高3位的值)privatestaticfinalintRUNNING=-1COUNT_BITS;// 111...privatestaticfinalintSHUTDOWN=0COUNT_BITS;// 000...privatestaticfinalintSTOP=1COUNT_BITS;// 001...privatestaticfinalintTIDYING=2COUNT_BITS;// 010...privatestaticfinalintTERMINATED=3COUNT_BITS;// 011...// 状态提取privatestaticintrunStateOf(intc){returnc~CAPACITY;}// 线程数提取privatestaticintworkerCountOf(intc){returncCAPACITY;}// 合并状态和线程数privatestaticintctlOf(intrs,intwc){returnrs|wc;}// ===== 核心参数 =====privatevolatileintcorePoolSize;// 核心线程数privatevolatileintmaximumPoolSize;// 最大线程数privatevolatilelongkeepAliveTime;// 空闲存活时间privatefinalBlockingQueueRunnableworkQueue;// 工作队列privatevolatileThreadFactorythreadFactory;// 线程工厂privatevolatileRejectedExecutionHandlerhandler;// 拒绝策略// ===== 内部集合 =====privatefinalHashSetWorkerworkers=newHashSet();// 工作线程集合privatefinalReentrantLockmainLock=newReentrantLock();// 主锁// ===== 统计 =====privateintlargestPoolSize;// 历史最大线程数privatelongcompletedTaskCount;// 已完成任务数privatelongtaskCount;// 已提交任务总数}源码要点:ctl用一个AtomicInteger同时存储状态和线程数,保证原子性workers是HashSetWorker,存储所有工作线程mainLock保护workers集合的并发访问最大线程数受CAPACITY限制(2^29 - 1 ≈ 5亿)2.2 Worker 内部类privatefinalclassWorkerextendsAbstractQueuedSynchronizer// 继承 AQS,实现不可重入锁implementsRunnable{finalThreadthread;// 工作线程RunnablefirstTask;// 初始任务(可能为null)volatilelongcompletedTasks;// 已完成任务数Worker(RunnablefirstTask){setState(-1);// 初始状态为 -1,防止运行前被中断this.firstTask=firstTask;this.thread=getThreadFactory().newThread(this);}publicvoidrun(){runWorker(this);// 委托给外部方法}// AQS 实现:不可重入锁protectedbooleanisHeldExclusively(){returngetState()!=0;}protectedbooleantryAcquire(intunused){if(compareAndSetState(0,1)){setExclusiveOwnerThread(Thread.currentThread());returntrue;}returnfalse;}protectedbooleantryRelease(intunused){setExclusiveOwnerThread(null);setState(0);returntrue;}}源码要点:Worker 继承 AQS 实现不可重入锁(state 只有 0 和 1)setState(-1)防止线程在启动前被中断thread字段是真正执行任务的线程firstTask是创建时传入的第一个任务,为 null 则从队列获取2.3 runWorker — 工作线程核心循环finalvoidrunWorker(Workerw){Threadwt=Thread.currentThread();Runnabletask=w.firstTask;w.firstTask=null;w.unlock();// 允许中断(state 从 -1 变为 0)booleancompletedAbruptly=true;try{// 核心循环:不断获取任务执行while(task!=null||(task=getTask())!=null){w.lock();// 加锁,防止执行中被中断// 判断是否需要中断if((runStateAtLeast(ctl.get(),STOP)||(Thread.interrupted()runStateAtLeast(ctl.get(),STOP)))!wt.isInterrupted())wt.interrupt();try{beforeExecute(wt,task);// 钩子方法Throwablethrown=null;try{task.run();// 执行任务(调用 Runnable.run())}catch(Throwablex){

最新新闻

日新闻

周新闻

月新闻