还剩36页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
并发编程Java欢迎参加《Java并发编程》课程!本课程将深入探讨Java多线程与并发编程的核心概念、实践技巧及最佳实践我们将从基础理论开始,逐步深入到高级应用,帮助您掌握在高并发环境下开发稳定、高效的Java应用程序的能力无论您是Java初学者还是有经验的开发者,本课程都将帮助您理解并发编程的复杂性以及如何在实际项目中应用这些知识让我们一起踏上Java并发编程的奇妙旅程!课程大纲并发编程基础与线程基础了解并发编程的概念、特性和挑战,掌握线程的创建、生命周期和基本操作线程安全与同步、内存模型Java学习保证线程安全的各种机制和Java内存模型的核心概念并发工具类与线程池掌握Java提供的并发工具类和线程池的使用,提高并发程序的性能和可靠性并发设计模式与实战案例学习常见的并发设计模式并通过实战案例巩固所学知识第一部分并发编程基础概念入门1理解并发编程的基本概念,区分并发与并行,了解Java中的并发支持重要性探索2了解为什么需要并发编程,以及它如何提高系统性能和资源利用率挑战认知3认识并发编程带来的挑战和问题,为后续学习做准备特性学习4深入理解并发编程的三大特性原子性、可见性和有序性什么是并发编程?定义与并行计算的区别在中的应用Java并发编程是指在单个程序中同时执行多个并发和并行虽然常被混用,但有本质区别Java从诞生之初就内建了对多线程的支持,任务的编程方式在Java中,这通常通过并发是指多个任务交替执行,而并行是指通过Thread类、Runnable接口以及后来多线程实现,允许程序同时执行多个独立多个任务同时执行并发关注的是任务的的Executor框架和并发包,提供了丰富的的任务流,从而提高程序的性能和响应能结构和管理,而并行关注的是任务的执行API和工具来实现并发编程力方式为什么需要并发编程?1提高系统吞吐量2提高响应性能3充分利用多核CPU并发编程允许系统同时处理多个请求,通过将耗时操作(如I/O操作、网络现代计算机普遍采用多核心处理器显著提高系统的吞吐能力例如,请求)放在独立的线程中执行,主线并发编程允许程序同时在多个处理器Web服务器可以同时处理成百上千程可以继续响应用户交互,提供更流核心上执行,充分利用硬件资源,实的客户端请求,而不是按顺序一个接畅的用户体验这在图形界面应用程现真正的并行计算,提高处理速度和一个地处理,大大减少了用户等待时序和移动应用中尤为重要效率间并发编程的挑战线程安全问题1多线程访问共享资源死锁2线程互相等待资源性能开销3线程创建和上下文切换成本在并发环境中,最常见的挑战是线程安全问题当多个线程同时访问和修改共享数据时,可能导致数据不一致或损坏例如,两个线程同时给一个变量加1,最终结果可能只加了1而不是2死锁是另一个严重问题,当两个或多个线程互相等待对方持有的资源时,所有相关线程都无法继续执行此外,线程创建和上下文切换都会带来额外的CPU和内存开销,过多的线程反而会导致性能下降并发编程的三大特性原子性()可见性()Atomicity Visibility原子性保证一个操作或一系列操可见性确保当一个线程修改了共作不会被中断,要么全部执行成享变量的值,其他线程能够立即功,要么全部不执行在Java中,看到这个修改Java中通过通过synchronized关键字和原子volatile关键字、synchronized类(如AtomicInteger)可以实和final可以保证可见性现原子性有序性()Ordering有序性保证程序执行的顺序按照代码的先后顺序执行由于编译器优化和CPU指令重排,代码的执行顺序可能与预期不符,通过volatile、synchronized和显式锁可以保证有序性第二部分线程基础线程概述了解线程的基本概念、与进程的区别以及线程的生命周期阶段线程创建掌握在Java中创建线程的多种方式及其各自的优缺点线程操作学习线程的基本操作,如启动、终止、休眠和让步等线程状态管理深入了解线程的状态转换机制、线程优先级调度和守护线程的特性什么是线程?定义与进程的区别线程的生命周期线程是程序执行的最小单位,是进程中的进程是操作系统分配资源的基本单位,拥Java线程的生命周期包括新建、就绪、运一个实体一个线程表示一个执行路径,有独立的内存空间而线程是进程内的执行、阻塞、等待、超时等待和终止几个状每个线程有自己的程序计数器、栈和局部行单元,共享进程的资源线程创建和切态了解这些状态及其转换对于编写高效变量,但共享进程的堆内存和方法区换的开销远小于进程,但多线程间的通信的多线程程序至关重要和同步更加复杂创建线程的方式继承类实现接口实现接口Thread RunnableCallable通过继承Thread类并重写通过实现Runnable接口通过实现Callable接口并其run方法来创建线程并实现其run方法来创建实现其call方法来创建线这种方式的优点是实现简线程相比继承Thread类,程与Runnable不同,单直接,缺点是由于Java这种方式更加灵活,允许Callable可以返回执行结不支持多重继承,继承类继承其他类,也便于线果,并可以抛出异常,通Thread类后就不能再继承程间共享资源常与Future结合使用其他类•遵循组合优于继承的•可以获取线程执行的•直接获取当前线程,设计原则返回值无需使用•多个线程可以共享同•可以抛出异常Thread.currentThre一个目标对象•需要与adExecutorService配•代码简洁,适合简单合使用的多线程应用线程的基本操作启动线程通过调用Thread对象的start方法来启动线程这会使线程进入就绪状态,等待系统调度执行注意,不要直接调用run方法,这只会在当前线程中执行run方法,而不会创建新线程终止线程Java不推荐使用stop方法终止线程(已被废弃)正确的做法是使用中断标志或volatile变量作为循环条件,让线程自然结束通过调用interrupt方法可以请求线程中断,但线程需要自行检查并处理中断请求线程休眠通过Thread.sleeplong millis方法可以使当前线程暂停执行指定的时间,释放CPU资源但不释放锁休眠期间线程可能被中断,因此需要处理InterruptedException异常线程让步通过Thread.yield方法可以让当前线程暂停执行,让出CPU资源给优先级相同或更高的线程yield只是一个提示,并不保证当前线程一定会暂停执行线程的状态转换就绪()Runnable新建()New2线程已启动但等待CPU调度1线程被创建但尚未启动运行()Running线程正在执行35等待()Waiting阻塞()Blocked线程等待其他线程唤醒4线程等待获取锁线程创建后处于新建状态,调用start方法后进入就绪状态当获得CPU时间片后进入运行状态当线程等待获取锁时会进入阻塞状态,而调用wait、join等方法会进入等待状态超时等待(Timed Waiting)是线程等待一段特定的时间,如调用sleeptime或waittime方法当线程执行完毕或发生异常时,会进入终止(Terminated)状态,此时线程生命周期结束线程优先级15最低优先级默认优先级Thread.MIN_PRIORITY Thread.NORM_PRIORITY10最高优先级Thread.MAX_PRIORITY在Java中,线程优先级范围从1到10,默认为5通过Thread类的setPriorityint方法可以设置线程的优先级,优先级高的线程会获得更多的CPU时间片,但这只是一个提示,并不保证高优先级的线程一定先于低优先级的线程执行线程优先级的作用取决于操作系统和JVM的实现在某些操作系统上,Java线程优先级会映射到系统的优先级,而在其他系统上可能会被忽略因此,不应过度依赖线程优先级来控制执行顺序,而应使用更可靠的同步机制守护线程概念用途创建守护线程守护线程(Daemon Thread)是一种守护线程通常用于执行不重要的后台任通过调用Thread对象的在后台运行的低优先级线程,其作用是务,如垃圾回收、监控系统状态、清理setDaemontrue方法可以将线程设为其他非守护线程提供服务当JVM中系统资源等典型的守护线程包括JVM置为守护线程必须在调用start方法只剩下守护线程时,JVM将退出,无论中的垃圾回收线程、内存管理线程以及前设置,一旦线程启动,就无法更改其守护线程是否完成工作实现了定时机制的守护线程守护状态默认情况下,新创建的线程继承其父线程的守护状态第三部分线程安全与同步锁机制线程安全概念学习Java中的各种锁类型,如ReentrantLock、读写锁了解线程安全的定义、重要性以及常见的线程安全问题等1234同步机制同步工具掌握Java中的同步机制,包括synchronized关键字、探索更多的线程同步工具,如信号量、栅栏等volatile关键字等什么是线程安全?定义线程安全的重要性常见的线程安全问题线程安全是指在多线程环境下,程序能够在多线程程序中,线程安全是保证程序正线程安全问题主要包括原子性问题(多正确地处理共享数据,确保每个线程都能确性的基础如果不能保证线程安全,可线程同时更新共享变量)、可见性问题够获得正确的结果线程安全的代码可以能导致数据竞争(race condition)、数(一个线程的修改对其他线程不可见)和在多线程环境中运行,而不会导致数据不据不一致、死锁等问题,最终导致程序错有序性问题(代码执行顺序与预期不符)一致或损坏误或崩溃这些问题源于CPU缓存、指令重排和编译器优化关键字synchronized1作用2使用方法3实现原理synchronized关键字用于保证线程synchronized可以用于修饰方法synchronized在JVM层面通过监视安全,通过互斥锁机制确保同一时刻(实例方法或静态方法)或代码块器(Monitor)实现每个对象都与只有一个线程可以执行同步代码块或修饰实例方法时,锁是当前对象一个监视器关联,当线程进入同步代方法它可以保证原子性、可见性和(this);修饰静态方法时,锁是当码时,会试图获取监视器,如果监视有序性,是Java中最基本的同步机制前类的Class对象;修饰代码块时,器已被占用,线程将被阻塞;当线程可以指定任意对象作为锁退出同步代码时,会释放监视器关键字volatile作用使用场景与的区别synchronizedvolatile关键字用于保证变量的可见性和volatile适用于以下场景1)一个线程写,volatile比synchronized更轻量级,不会有序性,但不能保证原子性当一个变量多个线程读的共享变量;2)作为状态标引起线程阻塞,但功能也更受限被声明为volatile时,对它的写操作会立志使用;3)双重检查锁定中的单例模式;volatile只能用于变量,且不保证原子性;即被其他线程看到,即保证了可见性;同4)读操作远多于写操作的场景由于不synchronized可用于方法和代码块,能时,volatile禁止了指令重排序,保证了保证原子性,volatile不适用于复合操作保证原子性、可见性和有序性,但会导致有序性(如i++)线程阻塞,性能较差锁的概念分布式锁1跨多个JVM的锁显式锁2Java提供的Lock接口实现内置锁3synchronized提供的锁锁是并发编程中用于控制多线程对共享资源访问的机制当一个线程获取锁后,其他试图获取同一锁的线程会被阻塞,直到锁被释放锁的主要作用是保证多线程环境下的数据一致性和程序正确性Java中的锁可以分为内置锁(synchronized提供的锁)和显式锁(java.util.concurrent.locks包中提供的锁)内置锁使用简单但功能有限,显式锁功能丰富但使用复杂根据锁的特性,还可以分为公平锁/非公平锁、可重入锁/不可重入锁、独占锁/共享锁、乐观锁/悲观锁等不同类型ReentrantLock特性使用方法与的比较synchronizedReentrantLock是使用ReentrantLock需要显式调用lock相比synchronized,ReentrantLock提java.util.concurrent.locks包中的一个显方法获取锁,并在finally块中调用unlock供了更多的功能和更好的性能式锁实现,提供了比synchronized更丰富方法释放锁这样可以确保即使在临界区ReentrantLock允许非阻塞地获取锁的功能它的主要特性包括可重入性发生异常,锁也能被正确释放同时,(tryLock),支持公平锁,可以创建多(同一线程可以多次获取同一个锁)、公ReentrantLock还提供了tryLock方法尝个条件变量,支持可中断锁获取和超时锁平性选择(可以创建公平锁或非公平锁)、试获取锁,以及newCondition方法创建获取但ReentrantLock使用更复杂,且可中断性(获取锁的过程可以被中断)和条件变量必须手动释放锁,否则可能导致死锁超时锁获取读写锁读锁(共享锁)写锁(排他锁)ReentrantReadWriteLock多个线程可以同时获取读写锁是独占的,一次只能锁,适用于读多写少的场有一个线程获取写锁当Java提供的读写锁实现,景读锁允许多个线程同一个线程持有写锁时,其可重入且支持公平性选择时读取共享资源,但会阻他线程无法获取读锁或写它包含一对锁止其他线程获取写锁锁,必须等待写锁释放ReadLock和WriteLock,分别用于读操作和写操作读写锁的优势在于提高并发性能,特别是在读多写少的场景下相比排他锁(如ReentrantLock),读写锁允许多个读线程同时访问共享资源,只有在需要写入时才会阻塞读写锁适用于对共享资源读取频率远高于修改频率的场景,如缓存、配置信息等通过分离读锁和写锁,读写锁能够最大化并发访问能力,提高系统吞吐量第四部分内存模型Java内存模型概述1了解Java内存模型的定义、目的和核心内容内存架构2掌握主内存与工作内存的概念及数据流转机制happens-before3理解happens-before原则及其在并发编程中的重要性内存屏障4学习内存屏障的概念、类型及其作用内存模型()概述Java JMM定义目的主要内容Java内存模型(Java MemoryModel,JMM的主要目的是解决多线程编程中的可JMM的主要内容包括主内存与工作内存JMM)是一种规范,它定义了Java虚拟机见性、原子性和有序性问题通过定义一的概念、内存间的操作规则、volatile的如何与计算机内存交互,以及多线程程序套规则,JMM屏蔽了各种硬件平台和操作特殊规则、原子性、可见性、有序性保证,如何共享数据JMM规定了线程如何和何系统的内存访问差异,使Java程序在各种以及happens-before原则这些规则共时可以看到其他线程修改过的共享变量的平台上都能得到一致的内存访问效果同构成了Java多线程编程的基础值,以及在必须时如何同步访问共享变量主内存与工作内存主内存工作内存数据流转过程在JMM中,主内存是所有线程共享的内存工作内存是每个线程私有的内存区域,存储当线程需要读取一个变量时,必须先从主内区域,存储了Java程序中所有的变量包了该线程正在使用的主内存中变量的副本存复制到自己的工作内存;当线程需要写入括实例变量、静态变量等,但不包括局部变线程对变量的所有操作(读取、赋值等)都一个变量时,必须先在自己的工作内存中修量和方法参数,因为这些是线程私有的主必须在工作内存中进行,而不能直接操作主改,然后再同步回主内存这个过程可能导内存是多线程之间共享变量的存储媒介内存中的变量致线程间的数据不一致,是并发问题的根源原则happens-before1定义2重要性happens-before原则是JMM中的happens-before原则是理解Java一个关键概念,它定义了两个操作并发程序正确性的基础它提供了之间的执行顺序如果操作A一种判断多线程程序中操作执行顺happens-before操作B,那么操序的方法,帮助程序员确定什么时作A的执行结果对操作B可见,且候可以安全地进行并发操作如果操作A的执行顺序排在操作B之前两个操作之间不存在happens-before关系,那么JVM可能会对它们进行重排序38种happens-before规则Java定义了8种happens-before规则程序顺序规则(同一线程中的操作按程序顺序执行)、监视器锁规则(解锁happens-before后续的加锁)、volatile变量规则(写happens-before后续的读)、线程启动规则(启动线程happens-before线程中的操作)、线程终止规则、线程中断规则、对象终结规则和传递性规则内存屏障概念类型内存屏障(Memory Barrier)是一常见的内存屏障类型包括种CPU指令,用于控制特定条件下的LoadLoad屏障(确保Load1先于重排序和内存可见性问题在Java中,Load2)、StoreStore屏障(确保JVM会根据需要插入内存屏障指令,Store1先于Store2)、LoadStore来保证程序的正确执行顺序和内存可屏障(确保Load1先于Store2)和见性StoreLoad屏障(确保Store1先于Load2)其中StoreLoad屏障是最强的,相当于同时具有其他三种屏障的效果作用内存屏障的主要作用是阻止特定类型的指令重排序,保证内存可见性例如,volatile变量的写操作会在写后插入StoreLoad屏障,保证写入的值能立即被其他线程看到;锁的获取会在前面插入LoadLoad屏障,保证获取锁后能看到其他线程的写入第五部分并发工具类Java提供了丰富的并发工具类,帮助开发者更容易地实现线程安全的程序这些工具类分为几类原子类(保证操作的原子性)、同步工具(如CountDownLatch、CyclicBarrier、Semaphore、Exchanger等用于线程协作)和并发容器(线程安全的集合类)这些工具类都经过精心设计和优化,可以简化并发编程,提高程序性能和可靠性在本部分,我们将深入学习这些工具类的使用方法、原理和适用场景原子类AtomicInteger AtomicLongAtomicReferenceAtomicInteger提供了int值的原子操作,AtomicLong与AtomicInteger类似,但AtomicReference提供了对象引用的原包括原子性的get、set、增加、减少和比操作的是long类型的值它适用于需要原子操作,可以原子性地更新一个对象引用较并交换等操作它是通过底层的CAS子操作的长整型变量,如统计数据、唯一它适用于需要原子更新对象的场景,如原(Compare andSwap)操作实现的,ID生成器等与synchronized相比,子性地替换缓存中的对象、实现无锁数据可以在不使用锁的情况下保证操作的原子AtomicLong的性能更高,尤其是在高并结构等AtomicReference还有扩展类性,适合于计数器、序列生成器等场景发场景下型,如AtomicStampedReference和AtomicMarkableReference等CountDownLatch创建线程减少计数CountDownLatch1指定初始计数值调用countDown2继续执行等待计数归零43计数为零后解除阻塞调用awaitCountDownLatch是一种同步辅助类,允许一个或多个线程等待其他线程完成操作它的工作原理是初始化一个计数器,线程可以调用await方法阻塞等待计数器归零,而其他线程则通过调用countDown方法减少计数,当计数归零时,等待的线程被释放继续执行CountDownLatch适用于一组线程需要等待另一组线程完成工作的场景,如主线程等待所有工作线程完成初始化,或者线程需要等待所有资源准备就绪CountDownLatch是一次性的,计数归零后无法重置,如果需要重复使用,可以考虑CyclicBarrierCyclicBarrier1创建CyclicBarrier指定参与线程数和可选的屏障动作屏障动作是一个Runnable任务,将在每次屏障打开时执行,通常用于汇总计算结果或准备下一阶段的工作线程到达屏障2线程调用barrier.await方法表示已到达屏障点,然后等待其他线程await方法会阻塞当前线程,直到所有参与线程都到达屏障点屏障打开3当最后一个线程到达屏障点时,屏障打开,所有等待的线程被释放,可以继续执行如果指定了屏障动作,会先执行屏障动作,然后才释放所有线程屏障重置4屏障打开后会自动重置,可以再次使用这是CyclicBarrier与CountDownLatch的主要区别,使它适合于重复进行的多阶段计算与CountDownLatch不同,CyclicBarrier用于让一组线程互相等待,直到所有线程都到达一个公共屏障点,然后一起继续执行CyclicBarrier适用于并行迭代算法、多阶段计算等场景,其可重用性使其非常适合处理重复的并行任务Semaphore概念信号量(Semaphore)是一种计数信号量,用于控制同时访问特定资源的线程数量Semaphore维护了一组许可(permits),线程可以获取(acquire)或释放(release)许可当没有可用许可时,尝试获取许可的线程将被阻塞,直到有许可被释放工作原理Semaphore内部有一个计数器表示可用许可数量每次调用acquire方法会使计数器减少,而release方法会使计数器增加当计数器为0时,acquire方法会阻塞线程,直到其他线程调用release增加可用许可使用场景Semaphore适用于需要限制同时访问某些资源的线程数量的场景,如数据库连接池、文件句柄限制、网络带宽限制等它可以实现流量控制,防止系统资源被过度消耗,保证系统的稳定运行Exchanger概念工作原理使用场景Exchanger是一种用于两个线程之间交换当一个线程调用Exchanger的Exchanger适用于两个线程需要相互配合数据的同步点当两个线程都到达交换点exchangeV x方法时,它会等待另一个工作的场景,如生产者消费者模式中,时,他们交换数据缓冲区,然后继续执行线程也调用exchange方法当两个线程生产者填充缓冲区,消费者清空缓冲区,这种机制可以简化在两个线程之间传递数都调用了exchange方法后,Exchanger然后交换缓冲区;遗传算法中,两个线程据的过程,并确保数据的可见性会交换它们提供的对象,并返回对方提供计算的部分解可以进行交换以产生新的解;的对象如果等待超时,exchange方法校对工作中,两个线程可以交换结果进行会抛出TimeoutException验证并发容器ConcurrentHashMap CopyOnWriteArrayListConcurrentHashMap是HashMap CopyOnWriteArrayList是的线程安全版本,但与Hashtable不ArrayList的线程安全变体,它通过同,它采用了分段锁(JDK
1.7)或创建底层数组的副本来实现写操作CAS+synchronized(JDK
1.8)的每次修改(添加/删除元素)都会创机制,大大提高了并发性能它允许建一个新的数组副本,使得读操作可多个线程同时读取和部分写入操作,以在不加锁的情况下进行,特别适合适用于读操作远多于写操作的高并发读多写少的并发场景场景BlockingQueueBlockingQueue是一个接口,定义了阻塞的入队和出队操作当队列满时,入队操作会阻塞;当队列空时,出队操作会阻塞常见实现有LinkedBlockingQueue(无界队列)、ArrayBlockingQueue(有界队列)和PriorityBlockingQueue(优先级队列)等,适用于生产者-消费者模式第六部分线程池线程池概述1了解线程池的定义、优势和核心参数常见线程池2掌握Java提供的几种常见线程池自定义线程池3学习如何自定义线程池以满足特定需求高级特性4深入了解线程池的工作原理和高级特性线程池概述定义优势核心参数线程池是一种线程使用模式,它在内部预线程池的主要优势包括降低资源消耗线程池的核心参数包括核心线程数先创建一定数量的线程,这些线程可以重(重复利用已创建的线程)、提高响应速(corePoolSize,池中保持的最小线程复使用,执行多个任务当需要执行任务度(任务到达时不需要等待线程创建)、数)、最大线程数(maximumPoolSize,时,不需要创建新线程,而是从池中获取提高线程的可管理性(统一分配、调优和池允许的最大线程数)、线程存活时间一个空闲线程来执行任务,任务执行完毕监控)、防止系统资源耗尽(限制线程数(keepAliveTime,非核心线程的空闲存后,线程不会销毁,而是返回池中等待下量)在高并发环境下,线程池是提高系活时间)、工作队列(workQueue,存一个任务统性能的关键技术放等待执行的任务)、线程工厂(threadFactory,创建新线程)和拒绝策略(handler,队列满且达到最大线程数时的处理策略)常见的线程池FixedThreadPool CachedThreadPoolScheduledThreadPoolFixedThreadPool是一个固定大小的CachedThreadPool是一个可缓存的ScheduledThreadPool是一个支持线程池,通过线程池,通过定时和周期性任务的线程池,通过Executors.newFixedThreadPooli Executors.newCachedThreadPool Executors.newScheduledThreadPnt nThreads创建它的特点是核心创建它的特点是核心线程数为0,oolint corePoolSize创建它的特线程数等于最大线程数,没有非核心最大线程数是Integer.MAX_VALUE,点是核心线程数固定,最大线程数是线程,使用无界队列存放任务这种线程空闲时间为60秒,使用Integer.MAX_VALUE,使用线程池适合于负载比较重的服务器,SynchronousQueue作为工作队列DelayedWorkQueue作为工作队列可以保证任务队列中的任务按照提交这种线程池适合于执行大量短期异步这种线程池适合需要多个后台线程执顺序被执行任务的程序行周期任务的场景SingleThreadExecutorSingleThreadExecutor是只有一个线程的线程池,通过Executors.newSingleThreadExecutor创建它的特点是核心线程数和最大线程数都是1,使用无界队列存放任务这种线程池适合需要保证顺序地执行各个任务的场景自定义线程池1ThreadPoolExecutor类2参数配置ThreadPoolExecutor是Java线程池自定义线程池时,需要根据应用场景的核心实现类,通过直接使用它可以合理配置以下参数核心线程数(根创建自定义的线程池Executors工据CPU密集型或IO密集型任务特点设厂方法创建的线程池都是置)、最大线程数(防止资源耗尽)、ThreadPoolExecutor的包装通过线程存活时间(减少空闲线程资源占自定义ThreadPoolExecutor,可以用)、工作队列(选择合适的队列实更精细地控制线程池的行为,满足特现)、线程工厂(自定义线程名称、定的业务需求优先级等)和拒绝策略(合理处理过载情况)3最佳实践线程池的最佳实践包括避免使用Executors创建线程池(可能导致OOM),而是直接使用ThreadPoolExecutor;根据任务类型(CPU密集型或IO密集型)合理设置线程数;为线程指定有意义的名称便于问题排查;根据实际需求选择合适的工作队列和拒绝策略;监控线程池运行状态,及时调整参数线程池的工作原理提交任务当通过execute或submit方法向线程池提交一个新任务时,线程池会执行以下判断流程来决定如何处理这个任务这是线程池工作的起点,也是理解线程池工作原理的关键核心线程处理如果当前运行的线程数小于核心线程数corePoolSize,则创建一个新线程来执行任务,即使其他核心线程是空闲的这一策略有助于提高响应速度,因为核心线程会一直保持活动状态任务队列存储如果当前运行的线程数等于或大于核心线程数,则将新任务放入工作队列workQueue中等待执行队列的选择(无界队列、有界队列、同步队列)会显著影响线程池的行为和性能非核心线程处理如果工作队列已满且当前运行的线程数小于最大线程数maximumPoolSize,则创建一个新线程来执行任务这些非核心线程在空闲超过keepAliveTime后会被终止,用于应对临时的负载高峰拒绝策略执行如果工作队列已满且当前运行的线程数等于最大线程数,则根据拒绝策略RejectedExecutionHandler处理该任务常见的拒绝策略包括抛出异常、丢弃任务、丢弃最旧的任务或由调用者线程执行任务。
个人认证
优秀文档
获得点赞 0