XeonYu
但行好事 莫问前程
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Kotlin 协程之 SharedFlow 与 StateFlow 深度解析
SharedFlow 跟 StateFlow 详解原创 2025-09-21 15:51:51 · 482 阅读 · 0 评论 -
Kotlin 协程之 突破 Flow 限制:Channel 与 Flow 的结合之道
上一篇文章介绍了 Flow的基本概念和使用,也知道了Flow强调单一执行流与上下文一致性,不允许跨协程并发emit。但在实际开发中,我们可能会遇到需要"多协程并发生产 + 按需收集",同时还想复用Flow的操作符体系的场景。可以多协程并发生产数据具备冷流的特性,有消费者消费才开始生产,并且每次消费时,生产逻辑会重新开始执行能利用 flow 强大的操作符这就需要用到了, 它是将Flow的特性与Channel的特性结合,实现多协程并发生产 + 按需收集。至此,就都介绍完毕了,来整体对比看下方式。原创 2025-09-07 16:03:55 · 1069 阅读 · 0 评论 -
Kotlin 协程之 Flow 的理解使用及源码解析
Kotlin Flow 冷热流对比与使用 本文对比了Kotlin中Channel(热流)和Flow(冷流)的核心特性与使用场景原创 2025-09-07 15:46:34 · 864 阅读 · 0 评论 -
Kotlin 协程之Channel 的高阶应用
了解了Channel 的基础概念和基本使用后,我们再来看一看 Channel 的特性以及高阶应用。Channel 是热流,这意味着什么?简单说就是生产者不等人。不管有没有消费者在那儿等着,生产者该干嘛干嘛,数据照样往Channel里塞。这个特性在实际开发中特别有用。比如你在做日志收集系统,不管有没有消费日志,日志数据肯定是持续产生的,Channel的热流特性正好匹配到这个场景。原创 2025-08-28 10:57:43 · 1029 阅读 · 0 评论 -
Kotlin 协程之Channel的概念和基本使用
Channel 的概念和基础使用以及原理讲解原创 2025-08-19 15:08:51 · 1195 阅读 · 0 评论 -
Kotlin 协程之常用作用域
Kotlin协程作用域详解 本文介绍了Kotlin协程中几种常见的作用域及其特点: GlobalScope: 顶层单例对象,coroutineContext为EmptyCoroutineContext 创建的协程没有父协程,生命周期伴随整个应用 适用于独立、生命周期长的全局任务 coroutineScope: 挂起函数,会创建新的作用域并挂起当前协程 继承外部上下文但重写Job对象 子协程失败会取消所有子协程并向上传递异常 适用于需要等待多个子任务完成的并发场景 还提及了supervisorScope、vi原创 2025-05-05 09:00:00 · 155 阅读 · 0 评论 -
kotlin协程之CoroutineScope 与 CoroutineContext 详解
本文深入讲解了Kotlin协程中的CoroutineScope和CoroutineContext。CoroutineScope是协程作用域接口,用于创建协程(提供launch/async等API)和保存CoroutineContext;CoroutineContext是协程上下文接口,存储协程运行所需的各种元素(如Job、Dispatcher等)。文章分析了二者关系,并通过源码解读了关键操作:如+运算符的实现原理(合并Context生成CombinedContext)、get方法获取特定元素等。理解这两个概原创 2025-03-08 17:16:36 · 1341 阅读 · 0 评论 -
kotlin协程之异常隔离:SupervisorJob & supervisorScope
kotlin协程的异常隔离详解原创 2025-02-09 13:53:23 · 1265 阅读 · 0 评论 -
Kotlin协程之结构化异常详解
kotlin协程异常详解原创 2024-10-22 09:23:40 · 967 阅读 · 0 评论 -
Kotlin协程之结构化取消详解
协程的取消详解以及源码分析原创 2024-10-10 21:09:22 · 1161 阅读 · 0 评论 -
Kotlin协程之协程的结构化详解
协程是存在父子关系的,父协程可以有多个子协程,子协程也可以有多个子协程,形成一个树形结构。父子关系是通过Job对象的parent和children来维护的,Job对象是确定父子关系的关键。正常在一个协程中直接启动子协程,这样默认就是父子关系,方便管理。尽量不要在一个协程中启动不是它的子协程的协程,这样会导致协程的父子关系混乱,不利于协程的管理。//创建一个协程作用域= null= nullprintln("父协程")${job")原创 2024-09-11 22:11:45 · 1122 阅读 · 0 评论 -
kotlin协程之 协程概念的具像化
从代码的角度详细解释到底什么是协程,以及我们应该如何的理解它原创 2024-08-28 15:48:08 · 470 阅读 · 0 评论 -
kotlin协程之runBlocking
上一篇:Callback转挂起函数文章中,介绍了在Kotlin协程中如何把传统的回调风格的异步操作转换为协程风格的挂起函数,这个在开发过程中是非常常用的,主要用于把 callback 风格的代码转换为协程中的挂起函数,以便于我们在协程环境中调用。但是,有时候我们也会遇到一些特殊的情况,比如我们需要在线程中调用已存在的协程代码,并且希望这个线程能够阻塞等待协程执行完毕,这时候就需要用到函数了。的核心作用是阻塞当前线程并等待协程执行完毕,主要用于在线程中调用协程代码并且希望阻塞等待协程执行完毕的场景中。原创 2024-08-13 14:18:30 · 649 阅读 · 0 评论 -
kotlin 协程之Callback转挂起函数
在 Kotlin 协程中可以通过挂起函数来实现异步操作的串行化,但是在日常开发场景中,大部分项目都是java和kotlin并存的,老旧的Java代码除非有需求,否则不会轻易改动重构。即使项目是纯kotlin开发的,也会有一些java代码实现的三方库,因此,我们很难规避掉所有的 Callback,而且Callback是一种非常常见的设计模式,我们经常会在项目中看到。当然,在协程中,我们也可以使用Callback。原创 2024-06-25 08:00:00 · 1069 阅读 · 0 评论 -
Kotlin 协程真的轻量吗?
本文探讨了Kotlin协程是否真的轻量,通过对比协程和线程的实现,指出协程在开发使用上的轻量性,如非阻塞式设计、简洁的代码和自动线程管理。然而,从底层执行原理来看,协程仍然依赖于线程,因此轻量性主要体现在开发者体验上。原创 2024-06-12 17:00:50 · 963 阅读 · 0 评论 -
kotlin 协程之初识挂起函数
本文介绍了Kotlin协程中的挂起函数,包括挂起函数的概念、自定义方法以及挂起和恢复的本质。挂起函数通过`suspend`关键字标识,允许在不阻塞线程的情况下进行异步操作。挂起函数只能在协程或另一挂起函数中调用。文章通过代码示例和反编译分析揭示了挂起函数如何在后台执行并恢复执行的机制。原创 2024-06-12 16:56:10 · 823 阅读 · 0 评论 -
Kotlin 协程:从基础概念到开发实践
上一篇文章深入理解Android多线程开发:场景应用与解决方案解析针对Android开发中的多线程应用场景和相应的解决方案做了一个梳理。资源复用和优化切线程任务编排并结合示例说明了Kotlin协程在处理上述问题时的优势。Kotlin协程自从2018年底成为kotlin语言的正式特性后,到现在已经5个年头了。而kotlin这门语言也在最近正式推出了2.0版本,带来了更好的支持多平台开发以及更快的编译速度。我自己算是比较早就开始尝试使用协程来解决开发中的各种需求。原创 2024-06-11 09:32:19 · 1144 阅读 · 0 评论 -
深入理解Android多线程开发:场景应用与解决方案解析
在专栏之前的文章中,我们了解了并发、线程、线程安全、线程池等多线程开发的概念。本篇文章,我们来梳理一下在Android开发中我们面临的多线程开发中常见的应用场景和解决方案。随着技术的飞速发展,我们在处理多线程相关的业务场景时有了更多选择和更为简洁的解决方案。从早期的线程, Handler,到后来的 RxJava,再到现在的 Kotlin协程,每一代技术都在不断提升我们的开发效率和代码质量。及时更新项目的技术栈,采用新的库和框架,能够显著提高我们的开发效率,同时降低出错的成本。原创 2024-06-09 11:45:00 · 878 阅读 · 0 评论 -
了解并发内存模型(JMM)和 Volatile
上一篇:了解 JVM和JVM内存结构(JVM运行时数据区)上一篇博客我们对JVM有了一个简单的了解,同时也大概了解了java代码在栈中是怎么运行的。本篇博客我们来了解一下并发内存模型(Java内存模型)。JMMJava Memory Model:Java 内存模型首先说概念:JMM是一种规范,...原创 2021-08-14 21:09:29 · 486 阅读 · 0 评论 -
了解JVM中的GC
如何判断一个对象是否是垃圾:引用计数器法,根节点可达性分析法垃圾回收算法:标记清除法,复制清除法,标记压缩法。JVM的分代结构:新生代,老年代原创 2021-08-08 18:16:29 · 562 阅读 · 0 评论 -
了解 JVM和JVM内存结构(JVM运行时数据区)
了解JVM内存结构以及一段java代码到底是如何执行的。原创 2021-07-18 20:10:22 · 560 阅读 · 0 评论 -
Java 线程池使用详解
使用线程池主要有以下好处:线程复用,降低资源消耗 提高程序响应速度方便管理,可以控制最大并发数重点理解ThreadPoolExecutor 构造中的7个参数以及不同任务数量的执行效果。原创 2021-07-03 19:22:41 · 3748 阅读 · 3 评论 -
JUC中的常用辅助类(CountDownLatch、CyclicBarrier、Semaphore)
JUC中的线程同步辅助类:CountDownLatch:减法计数器,当执行countDown方法数量达到指定数量后,触发后续操作。CyclicBarrier:循环屏障,每当执行await方法的次数达到指定数量,就会执行一遍Runnable方法Semaphore:信号量技术器,用来限制并发线程的数量(限流)原创 2021-06-27 18:18:40 · 530 阅读 · 3 评论 -
JUC中的 StampedLock
StampedLock 是ReentrantReadWriteLock的升级版,支持乐观读锁,但他是**不可重入锁**,主要区别在于乐观读锁实际上**不上锁**,不会阻塞写锁,理论上在读操作的性能上也会比ReentrantReadWriteLock的readLock性能要好(省去了加锁解锁的过程)。原创 2021-06-26 17:51:57 · 366 阅读 · 1 评论 -
JUC中的读写锁(ReentrantReadWriteLock)
JUC中的读写锁(ReadWriteLock)ReentrantReadWriteLock是一种悲观锁,其中写锁同时只能被一个线程持有,读锁可以同时被多个线程持有,所以,读写锁在多线程读的场景下效率会更高。比较适合在读多写少的场景下使用。原创 2021-06-23 21:19:01 · 462 阅读 · 2 评论 -
JUC中的线程通信 Condition
JUC中的线程通信Lock锁Condition线程通信原创 2021-06-20 22:04:00 · 352 阅读 · 1 评论 -
JUC中的 ReentrantLock
上一篇:从Java线程到kotlin协程之java.util.concurrent.locks包中的接口和实现类ReentrantLock (重入锁)重入锁就是可以多次上锁,实现了Lock接口跟synchronized不同,synchronized是自动上锁,自动解锁的,而Lock接口的实现类是需要手动上锁,手动解锁。先看一下ReentrantLock中的方法,常用的其实就是对Lock接口实现的方法。我们先来简单用一用,还是之前买票的例子:lock()获取锁,如果锁被其他线程持有,则处于阻原创 2021-06-19 15:48:34 · 346 阅读 · 1 评论 -
java.util.concurrent.locks 包中的接口和实现类
synchronized关键字相比较与JUC中的Lock有一定的缺陷比如:synchronized 不支持公平性,锁一旦释放,任何线程都能去获得释放的锁,很有可能出现其中一个线程一直获取锁资源,其他线程一直获取不到锁资源。如果一个线程不能获取到 synchronized的锁,那原创 2021-06-18 21:54:50 · 484 阅读 · 1 评论 -
JUC以及并发,线程同步,线程安全的概念加深
JUCJUC:就是JDK给我们提供好的一个工具包,提供了很多用于处理并发的类和接口。包名是 java.util.concurrent .取前三个字母就是JUC我们先大致看一眼这个包里都有啥可以看到,JUC包中有很多类和接口,我们之前用的Callable,FutureTask以及用来简化线程休眠的TimeUnit都在这个包中。所以说,基本上,不管你是Android开发还是Java开发,只要涉及到多线程并发的知识,这个包的代码你是一定会用到的,所以java.util.concurrent这个包里的类和原创 2021-06-18 15:48:38 · 394 阅读 · 1 评论 -
线程间的通信 wait、notify
上一篇:从Java线程到kotlin协程之线程同步(synchronized关键字)waitwait跟sleep方法的作用一样,也是让线程休眠,但是针对的对象不同。sleep: sleep是Thread类中的静态方法,是直接作用于线程的,在哪个线程调sleep,哪个线程就休眠,而且可以随时调用。sleep方法执行期间不会释放锁,其他线程也必须要等待sleep执行完毕后才有机会进入同步代码中。wait: wait是Object类中的一个普通方法,通过对象调用。但是必须在持有该对象锁的同步代码中调原创 2021-06-15 16:17:58 · 1669 阅读 · 1 评论 -
线程同步之synchronized关键字
上一篇:从Java线程到kotlin协程之线程合并 (join)线程的同步简单来讲,当多个线程要对同一个内存地址进行操作时,同一时间只能有一个线程对该内存地址进行操作,其他线程不可以对该内存地址进行操作,此时,其他线程处于等待状态,这个就是线程同步。实现线程同步的方法有很多。线程同步主要是为了解决数据安全的问题。我们先来看个经典的卖票例子。举个例子,总共有30张票,分5个窗口同时售卖,不加同步的代码如下object Ticket { /*总共票数*/ var totalCou原创 2021-06-14 13:55:19 · 1017 阅读 · 3 评论 -
线程合并 (join)
上一篇:从Java线程到kotlin协程之线程休眠 (sleep)线程合并(join)将指定的线程加入到当前线程,当前线程会处于 WAITING 状态,直到引用的线程死亡(出现异常或者执行完毕),然后当前线程再继续执行。先来看看join方法源码可以看到,join调用了另外一个重载的方法,我们再看看重载的那个方法。可以看到,join方法最终调用的是一个同步方法,接收一个毫秒值。我们来简单用一用:有以下代码 public static void main(String[] args原创 2021-06-13 14:47:33 · 1161 阅读 · 1 评论 -
线程休眠 (sleep)
上一篇:从Java线程到kotlin协程之线程的状态上一篇在看线程状态的时候我们用到了线程的几个方法例如:sleep join 实际上,这些方法就是对线程的调度(scheduled)本篇文章,我们先来看看简单看看线程的调度:Sleep 线程休眠线程休眠...原创 2021-06-13 11:23:43 · 5577 阅读 · 1 评论 -
Java线程的六种状态
New:新创建的线程,还没有调start执行Runnable:处于待运行以及正在运行中的线程Blocked:阻塞状态,等待获取synchronized锁继续执行的线程Waiting:等待状态,比如调用了wait,join等方法的线程Timed Waiting:等待固定时长的线程,比如调用了wait(time),sleep(time),join(time)的线程Terminated:正常运行结束或出现异常的线程原创 2021-06-05 16:55:30 · 473 阅读 · 4 评论 -
线程的基本使用
了解完多线程的概念之后,我们先来看一下线程的基本使用。Java线程的使用方式Java中实现线程的方式有一下三种继承Thread类,在子类实现run方法 实现Runable接口 实现Callable接口我们先来简单看看Thread类Thread类实现了Runnable接口Runnable接口中只有一个run方法,实际上,线程的任务就是在run方法中执行的,也就是说我们实际开发过程中就是在run方法里写业务代码。下面我们来看下三种方式的基本使用方式一:...原创 2021-05-30 20:39:19 · 454 阅读 · 2 评论 -
多线程开发的基本概念
在Android开发中,我们常常会遇到多线程开发的需求。由于Android中的,我们不能在主线程处理耗时逻辑,否则会导致卡顿,甚至出现ANR(应用无响应)等异常情况。因此,我们需要将网络请求等耗时操作放到中去执行,完成后再更新UI。多线程开发因此成为Android开发中的一个重要部分。随着Android开发技术的不断进步,从早期的使用Handler,到后来的RxJava,再到如今的Kotlin协程,切换线程以及并发编程的代码写起来是越来越简洁了。原创 2021-05-29 17:22:56 · 789 阅读 · 1 评论