协程示例
Coroutine.kt
fun main() = runBlocking { // this: CoroutineScope
launch { // 启动新协程
delay(1000L) // 非阻塞延时 1 秒
println("World!") // print after delay
}
println("Hello")
}
这是协程官方提供的一个示例 ,单从 Kotlin 代码无法完全理解协程的运行原理,Kotlin 协程除了协程提供的框架外,还需要 Kotlin 编译器配合,所以我们需要反编译字节码的方式查看协程的运行逻辑。
Coroutine.kt 编译后生成 CoroutineKt.class
public final class CoroutineKt {
public static final void main() {
// 调用 runBlocking$default 方法
BuildersKt.runBlocking$default((CoroutineContext)null,
// 创建 CoroutineKt$main$1 对象
(Function2)(new CoroutineKt$main$1((Continuation)null)), 1, (Object)null);
}
// 编译生成的 main 方法
// $FF: synthetic method
public static void main(String[] args) {
main(); // 调用 mian()函数
}
}
public final class BuildersKt {
// 调用 runBlocking$default 方法 var0 为 null ,var1 为 CoroutineKt$main$1 对象 ,var2 为 1 ,var3 为 null
// $FF: synthetic method
public static Object runBlocking$default(CoroutineContext var0, Function2 var1, int var2, Object var3) throws InterruptedException {
return BuildersKt__BuildersKt.runBlocking$default(var0, var1, var2, var3);
}
// context 为 EmptyCoroutineContext 对象 , block 为 CoroutineKt$main$1 对象
public static final Object runBlocking(@NotNull CoroutineContext context, @NotNull Function2 block) throws InterruptedException {
// 调用 runBlocking 方法
return BuildersKt__BuildersKt.runBlocking(context, block);
}
}
final class BuildersKt__BuildersKt {
// 调用 runBlocking$default 方法 var0 为 null ,var1 为 CoroutineKt$main$1 对象 ,var2 为 1 ,var3 为 null
// $FF: synthetic method
public static Object runBlocking$default(CoroutineContext var0, Function2 var1, int var2, Object var3) throws InterruptedException {
// var2 为 1 ,var0 为 EmptyCoroutineContext 对象
if ((var2 & 1) != 0) {
var0 = (CoroutineContext) EmptyCoroutineContext.INSTANCE;
}
// 调用 BuildersKt.runBlocking()方法
return BuildersKt.runBlocking(var0, var1);
}
}
// 继承 SuspendLambda 实现了 Function2 函数
final class CoroutineKt$main$1 extends SuspendLambda implements Function2 {
int label;
// $FF: synthetic field
private Object L$0;
// 构造函数 $completion 为 null
CoroutineKt$main$1(Continuation $completion) {
super(2, $completion);
}
// 实现 BaseContinuationImpl invokeSuspend 方法
@Nullable
public final Object invokeSuspend(@NotNull Object var1) {
IntrinsicsKt.getCOROUTINE_SUSPENDED();
switch (this.label) {
case 0:
ResultKt.throwOnFailure(var1);
CoroutineScope $this$runBlocking = (CoroutineScope)this.L$0;
BuildersKt.launch$default($this$runBlocking, (CoroutineContext)null, (CoroutineStart)null, (Function2)(new CoroutineKt$main$1$1((Continuation)null)), 3, (Object)null);
System.out.println("Hello");
return Unit.INSTANCE;
default:
throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
}
}
// 覆写 BaseContinuationImpl create 方法
@NotNull
public final Continuation create(@Nullable Object value, @NotNull Continuation $completion) {
CoroutineKt$main$1 var3 = new CoroutineKt$main$1($completion);
var3.L$0 = value;
return (Continuation)var3;
}
// 实现 Function2 invoke方法
@Nullable
public final Object invoke(@NotNull CoroutineScope p1, @Nullable Continuation p2) {
return ((CoroutineKt$main$1)this.create(p1, p2)).invokeSuspend(Unit.INSTANCE);
}
}
// 继承 SuspendLambda 实现了 Function2 函数
final class CoroutineKt$main$1$1 extends SuspendLambda implements Function2 {
int label;
CoroutineKt$main$1$1(Continuation $completion) {
super(2, $completion);
}
// 实现 BaseContinuationImpl invokeSuspend 方法
@Nullable
public final Object invokeSuspend(@NotNull Object $result) {
Object var2 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
switch (this.label) {
case 0:
ResultKt.throwOnFailure($result);
Continuation var10001 = (Continuation)this;
this.label = 1;
if (DelayKt.delay(1000L, var10001) == var2) {
return var2;
}
break;
case 1:
ResultKt.throwOnFailure($result);
break;
default:
throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
}
System.out.println("World!");
return Unit.INSTANCE;
}
// 覆写 BaseContinuationImpl create 方法
@NotNull
public final Continuation create(@Nullable Object value, @NotNull Continuation $completion) {
return (Continuation)(new CoroutineKt$main$1$1($completion));
}
// 实现 Function2 invoke方法
@Nullable
public final Object invoke(@NotNull CoroutineScope p1, @Nullable Continuation p2) {
return ((CoroutineKt$main$1$1)this.create(p1, p2)).invokeSuspend(Unit.INSTANCE);
}
}
SuspendLambda 和 Continuation
// SuspendLambda 继承 ContinuationImpl
internal abstract class SuspendLambda(
public override val arity: Int,
completion: Continuation<Any?>?
) : ContinuationImpl(completion), FunctionBase<Any?>, SuspendFunction {
constructor(arity: Int) : this(arity, null)
}
// suspend 函数标记接口
internal interface SuspendFunction
// FunctionBase 函数,只有一个成员变量 arity
public interface FunctionBase<out R> : Function<R> {
public val arity: Int
}
// ContinuationImpl 继承 BaseContinuationImpl
internal abstract class ContinuationImpl(
completion: Continuation<Any?>?,
private val _context: CoroutineContext?
) : BaseContinuationImpl(completion) {
// 从 Continuation 获取协程上下文
constructor(completion: Continuation<Any?>?) : this(completion, completion?.context)
public override val context: CoroutineContext
get() = _context!!
@Transient
private var intercepted: Continuation<Any?>? = null
public fun intercepted(): Continuation<Any?> =
intercepted
?: (context[ContinuationInterceptor]?.interceptContinuation(this) ?: this)
.also { intercepted = it }
protected override fun releaseIntercepted() {
val intercepted = intercepted
if (intercepted != null && intercepted !== this) {
context[ContinuationInterceptor]!!.releaseInterceptedContinuation(intercepted)
}
this.intercepted = CompletedContinuation // just in case
}
}
// BaseContinuationImpl 继承 Continuation
internal abstract class BaseContinuationImpl(
public val completion: Continuation<Any?>?
) : Continuation<Any?>, CoroutineStackFrame, Serializable {
protected abstract fun invokeSuspend(result: Result<Any?>): Any?
protected open fun releaseIntercepted() {
}
public open fun create(completion: Continuation<*>): Continuation<Unit> {
throw UnsupportedOperationException("create(Continuation) has not been overridden")
}
public open fun create(value: Any?, completion: Continuation<*>): Continuation<Unit> {
throw UnsupportedOperationException("create(Any?;Continuation) has not been overridden")
}
public override fun toString(): String =
"Continuation at ${getStackTraceElement() ?: this::class.java.name}"
// --- CoroutineStackFrame implementation
public override val callerFrame: CoroutineStackFrame?
get() = completion as? CoroutineStackFrame
public override fun getStackTraceElement(): StackTraceElement? =
getStackTraceElementImpl()
}
public interface Continuation<in T> {
public val context: CoroutineContext
// 一个 resumeWith 方法
public fun resumeWith(result: Result<T>)
}
runBlocking 函数
// context 为 EmptyCoroutineContext 对象 , block 为 CoroutineKt$main$1 对象
public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
// 获取当前线程对象
val currentThread = Thread.currentThread()
// 从 context 获取 ContinuationInterceptor 对象 ,
// 由于 context 为 EmptyCoroutineContext 对象,所以 contextInterceptor 为 空
val contextInterceptor = context[ContinuationInterceptor]
val eventLoop: EventLoop?
val newContext: CoroutineContext
if (contextInterceptor == null) {
// 创建获取 EventLoop 对象
eventLoop = ThreadLocalEventLoop.eventLoop
// 生成新的协程上下文 ,EmptyCoroutineContext 空上下文 + EventLoop 为 EventLoop
newContext = GlobalScope.newCoroutineContext(context + eventLoop)
} else {
eventLoop = (contextInterceptor as? EventLoop)?.takeIf { it.shouldBeProcessedFromContext() }
?: ThreadLocalEventLoop.currentOrNull()
newContext = GlobalScope.newCoroutineContext(context)
}
// 创建 BlockingCoroutine 对象
val coroutine = BlockingCoroutine<T>(newContext, currentThread, eventLoop)
// 调用 BlockingCoroutine start 方法
coroutine.start(CoroutineStart.DEFAULT, coroutine, block)
// 调用 joinBlocking 方法
return coroutine.joinBlocking()
}
BlockingEventLoop
internal object ThreadLocalEventLoop {
private val ref = commonThreadLocal<EventLoop?>(Symbol("ThreadLocalEventLoop"))
// ref.get() 默认为 null ,调用 createEventLoop() 方法
internal val eventLoop: EventLoop
get() = ref.get() ?: createEventLoop().also { ref.set(it) }
internal fun currentOrNull(): EventLoop? =
ref.get()
internal fun resetEventLoop() {
ref.set(null)
}
internal fun setEventLoop(eventLoop: EventLoop) {
ref.set(eventLoop)
}
}
// 创建 BlockingEventLoop()对象
internal actual fun createEventLoop(): EventLoop = BlockingEventLoop(Thread.currentThread())
// BlockingEventLoop 继承 EventLoopImplBase
internal class BlockingEventLoop(
override val thread: Thread
) : EventLoopImplBase()
// EventLoopImplBase 继承 EventLoopImplPlatform 实现 Delay
internal abstract class EventLoopImplBase: EventLoopImplPlatform(), Delay {
}
// EventLoopImplPlatform 继承 EventLoop
internal expect abstract class EventLoopImplPlatform() : EventLoop {
protected fun unpark()
protected fun reschedule(now: Long, delayedTask: EventLoopImplBase.DelayedTask)
}
// EventLoop 继承 CoroutineDispatcher
internal abstract class EventLoop : CoroutineDispatcher() {}
// CoroutineDispatcher 继承 AbstractCoroutineContextElement,ContinuationInterceptor
public abstract class CoroutineDispatcher :
AbstractCoroutineContextElement(ContinuationInterceptor), ContinuationInterceptor {}
public abstract class AbstractCoroutineContextElement(public override val key: Key<*>) : Element
public interface ContinuationInterceptor : CoroutineContext.Element {
public companion object Key : CoroutineContext.Key<ContinuationInterceptor>
}
BlockingCoroutine
// parentContext 是 BlockingEventLoop 元素的协程上下文
// blockedThread 是运行 runBlocking 方法的线程
// eventLoop 就是 BlockingEventLoop 对象
private class BlockingCoroutine<T>(
parentContext: CoroutineContext,
private val blockedThread: Thread,
private val eventLoop: EventLoop?
) : AbstractCoroutine<T>(parentContext, true, true) {
}
// 协程对象,协程对象本身是实现了 Continuation 接口的
public abstract class AbstractCoroutine<in T>(
parentContext: CoroutineContext,
initParentJob: Boolean, // initParentJob 为 true
active: Boolean // active 为 true
) : JobSupport(active), Job, Continuation<T>, CoroutineScope {
init {
if (initParentJob) initParentJob(parentContext[Job])
}
}
public open class JobSupport constructor(active: Boolean) : Job, ChildJob, ParentJob {
}
public interface Job : CoroutineContext.Element {
}
public interface ChildJob : Job {
public fun parentCancelled(parentJob: ParentJob)
}
public interface ParentJob : Job {
public fun getChildJobCancellationCause(): CancellationException
}
调用 start 方法
// start 为 CoroutineStart.DEFAULT
// receiver 是 BlockingCoroutine 对象
// block 为 CoroutineKt$main$1 对象
public fun <R> start(start: CoroutineStart, receiver: R, block: suspend R.() -> T) {
start(block, receiver, this)
}
public enum class CoroutineStart {
// CoroutineStart.DEFAULT
public operator fun <R, T> invoke(block: suspend R.() -> T, receiver: R, completion: Continuation<T>): Unit =
when (this) {
// receiver 是 BlockingCoroutine 对象 ,completion 也是 BlockingCoroutine 对象
DEFAULT -> block.startCoroutineCancellable(receiver, completion)
ATOMIC -> block.startCoroutine(receiver, completion)
UNDISPATCHED -> block.startCoroutineUndispatched(receiver, completion)
LAZY -> Unit // will start lazily
}
}
// receiver 是 BlockingCoroutine 对象 ,completion 也是 BlockingCoroutine 对象
internal fun <R, T> (suspend (R) -> T).startCoroutineCancellable(
receiver: R, completion: Continuation<T>,
) = runSafely(completion) {
createCoroutineUnintercepted(receiver, completion).intercepted().resumeCancellableWith(Result.success(Unit))
}
// completion 是 BlockingCoroutine 对象
// block 为 函数对象
private inline fun runSafely(completion: Continuation<*>, block: () -> Unit) {
try {
block() // 调用函数
} catch (e: Throwable) {
dispatcherFailure(completion, e)
}
}
// 抛出异常
private fun dispatcherFailure(completion: Continuation<*>, e: Throwable) {
completion.resumeWith(Result.failure(e))
throw e
}
// receiver 是 BlockingCoroutine 对象 ,completion 也是 BlockingCoroutine 对象
public actual fun <R, T> (suspend R.() -> T).createCoroutineUnintercepted(
receiver: R,
completion: Continuation<T>
): Continuation<Unit> {
val probeCompletion = probeCoroutineCreated(completion)
// this 为 CoroutineKt$main$1 对象 属于 BaseContinuationImpl 子类
return if (this is BaseContinuationImpl)
// 调用 CoroutineKt$main$1 create 方法
create(receiver, probeCompletion)
else {
createCoroutineFromSuspendFunction(probeCompletion) {
(this as Function2<R, Continuation<T>, Any?>).invoke(receiver, it)
}
}
}
创建 CoroutineKt$main$1 对象
// value 是 BlockingCoroutine 对象 ,$completion 也是 BlockingCoroutine 对象
public final Continuation create(@Nullable Object value, @NotNull Continuation $completion) {
// 创建 CoroutineKt$main$1 对象
CoroutineKt$main$1 var3 = new CoroutineKt$main$1($completion);
var3.L$0 = value; // BlockingCoroutine 对象
return (Continuation)var3;
}
CoroutineKt$main$1 对象 调用 intercepted() 方法
public actual fun <T> Continuation<T>.intercepted(): Continuation<T> =
(this as? ContinuationImpl)?.intercepted() ?: this
// 调用 ContinuationImpl ,intercepted() 方法
public fun intercepted(): Continuation<Any?> =
intercepted
// 由于构造函数里面传递了 BlockingCoroutine 对象
// 获取协程上下 ContinuationInterceptor 会得到 BlockingEventLoop 对象 ,
// 调用 interceptContinuation 方法
?: (context[ContinuationInterceptor]?.interceptContinuation(this) ?: this)
.also { intercepted = it }
// BlockingEventLoop 对象 interceptContinuation 方法 ,返回 DispatchedContinuation 对象
public final override fun <T> interceptContinuation(continuation: Continuation<T>): Continuation<T> = DispatchedContinuation(this, continuation)
// DispatchedContinuation 构造函数
// dispatcher 为 BlockingEventLoop 对象 ,continuation 为 CoroutineKt$main$1 对象
internal class DispatchedContinuation<in T>(
@JvmField internal val dispatcher: CoroutineDispatcher,
@JvmField val continuation: Continuation<T>
) : DispatchedTask<T>(MODE_UNINITIALIZED), CoroutineStackFrame, Continuation<T> by continuation {
// resumeMode 为 MODE_UNINITIALIZED
internal abstract class DispatchedTask<in T> internal constructor(
@JvmField var resumeMode: Int
) : SchedulerTask()
internal expect abstract class SchedulerTask internal constructor() : Runnable
internal actual typealias SchedulerTask = Task
DispatchedContinuation 调用 resumeCancellableWith 方法
// result为 Result.success(Unit)
public fun <T> Continuation<T>.resumeCancellableWith(
result: Result<T>,
): Unit = when (this) {
// 调用 DispatchedContinuation 的 resumeCancellableWith 方法
is DispatchedContinuation -> resumeCancellableWith(result)
else -> resumeWith(result)
}
// result为 Result.success(Unit)
internal inline fun resumeCancellableWith(result: Result<T>) {
val state = result.toState() // state 为 Unit 对象
// 默认为 true
if (dispatcher.isDispatchNeeded(context)) {
_state = state
resumeMode = MODE_CANCELLABLE
// 调用 BlockingEventLoop 对象 dispatch 方法
dispatcher.dispatch(context, this)
} else {
executeUnconfined(state, MODE_CANCELLABLE) {
if (!resumeCancelled(state)) {
resumeUndispatchedWith(result)
}
}
}
}
// context BlockingCoroutine 对象的 协程上下文 ,block 为 DispatchedContinuation 本身是 Runnable 对象
final override fun dispatch(context: CoroutineContext, block: Runnable 对象 ) = enqueue(block)
// Runnable 添加到队列
open fun enqueue(task: Runnable) {
enqueueDelayedTasks()
if (enqueueImpl(task)) {
unpark()
} else {
DefaultExecutor.enqueue(task)
}
}
private fun enqueueDelayedTasks() {
// _delayed 默认为 null
val delayed = _delayed.value
if (delayed != null && !delayed.isEmpty) {
val now = nanoTime()
while (true) {
delayed.removeFirstIf {
if (it.timeToExecute(now)) {
enqueueImpl(it)
} else
false
} ?: break
}
}
}
private fun enqueueImpl(task: Runnable): Boolean {
// _queue 默认为空
_queue.loop { queue ->
// _isCompleted 默认为 false
if (isCompleted) return false
when (queue) {
// _queue 设置为 DispatchedContinuation 对象 ,返回 ture
null -> if (_queue.compareAndSet(null, task)) return true
is Queue<*> -> {
when ((queue as Queue<Runnable>).addLast(task)) {
Queue.ADD_SUCCESS -> return true
Queue.ADD_CLOSED -> return false
Queue.ADD_FROZEN -> _queue.compareAndSet(queue, queue.next())
}
}
else -> when {
queue === CLOSED_EMPTY -> return false
else -> {
val newQueue = Queue<Runnable>(Queue.INITIAL_CAPACITY, singleConsumer = true)
newQueue.addLast(queue as Runnable)
newQueue.addLast(task)
if (_queue.compareAndSet(queue, newQueue)) return true
}
}
}
}
}
protected actual fun unpark() {
val thread = thread // atomic read
// 都是主线程,表达式为 false
if (Thread.currentThread() !== thread)
unpark(thread)
}
BlockingCoroutine.joinBlocking()
fun joinBlocking(): T {
registerTimeLoopThread()
try {
eventLoop?.incrementUseCount()
try {
while (true) {
// 如何线程中断了, 抛出异常 ,取消协程
if (Thread.interrupted()) throw InterruptedException().also { cancelCoroutine(it) }
// 调用 BlockingEventLoop 对象 processNextEvent 方法
val parkNanos = eventLoop?.processNextEvent() ?: Long.MAX_VALUE
if (isCompleted) break
// parkNanos 第一次返回 0 ,0不会阻塞,再次进行 while 循环
parkNanos(this, parkNanos)
}
} finally { // paranoia
eventLoop?.decrementUseCount()
}
} finally { // paranoia
unregisterTimeLoopThread()
}
// now return result
val state = this.state.unboxState()
(state as? CompletedExceptionally)?.let { throw it.cause }
return state as T
}
override fun processNextEvent(): Long {
// processUnconfinedEvent 返回 false
if (processUnconfinedEvent()) return 0
// queue all delayed tasks that are due to be executed
enqueueDelayedTasks()
// 取之前添加的 Runnable 对象 ,为 DispatchedContinuation 对象
val task = dequeue()
// task 不为 null
if (task != null) {
// 调用 DispatchedContinuation 对象 run 方法
platformAutoreleasePool { task.run() }
return 0
}
return nextTime
}
fun processUnconfinedEvent(): Boolean {
// unconfinedQueue 默认为 null ,返回 false
val queue = unconfinedQueue ?: return false
val task = queue.removeFirstOrNull() ?: return false
task.run()
return true
}
// 取出 Runnable 对象
private fun dequeue(): Runnable? {
_queue.loop { queue ->
when (queue) {
null -> return null
is Queue<*> -> {
val result = (queue as Queue<Runnable>).removeFirstOrNull()
if (result !== Queue.REMOVE_FROZEN) return result as Runnable?
_queue.compareAndSet(queue, queue.next())
}
// queue 为 为 DispatchedContinuation 对象
else -> when {
queue === CLOSED_EMPTY -> return null
// _queue 设置为 null ,返回 DispatchedContinuation 对象
else -> if (_queue.compareAndSet(queue, null)) return queue as Runnable
}
}
}
}
// DispatchedContinuation 对象 run 方法
final override fun run() {
assert { resumeMode != MODE_UNINITIALIZED }
var fatalException: Throwable? = null
try {
// delegate 为this ,DispatchedContinuation 对象
val delegate = delegate as DispatchedContinuation<T>
// continuation 为 CoroutineKt$main$1 对象
val continuation = delegate.continuation
withContinuationContext(continuation, delegate.countOrElement) {
val context = continuation.context
val state = takeState() // state 为 Unit 对象
val exception = getExceptionalResult(state) // exception 为 null
// resumeMode 为 MODE_CANCELLABLE
val job = if (exception == null && resumeMode.isCancellableMode) context[Job] else null
// job 为 BlockingCoroutine 对象 ,job.isActive 为 true
if (job != null && !job.isActive) {
val cause = job.getCancellationException()
cancelCompletedResult(state, cause)
continuation.resumeWithStackTrace(cause)
} else {
if (exception != null) {
continuation.resumeWithException(exception)
} else {
// getSuccessfulResult(state) 为 Unit
continuation.resume(getSuccessfulResult(state))
}
}
}
} catch (e: Throwable) {
// This instead of runCatching to have nicer stacktrace and debug experience
fatalException = e
} finally {
fatalException?.let { handleFatalException(it) }
}
}
// value 为 Unit
public inline fun <T> Continuation<T>.resume(value: T): Unit =
resumeWith(Result.success(value))
// result 为 Result<Unit> ,CoroutineKt$main$1 对象
public final override fun resumeWith(result: Result<Any?>) {
var current = this
var param = result
while (true) {
probeCoroutineResumed(current)
// current 为 CoroutineKt$main$1 对象
with(current) {
// completion 是 BlockingCoroutine 对象
val completion = completion!!
val outcome: Result<Any?> =
try {
// 调用 invokeSuspend 方法 ,返回 Unit 对象
val outcome = invokeSuspend(param) // param 为 Result<Unit>
if (outcome === COROUTINE_SUSPENDED) return
Result.success(outcome)
} catch (exception: Throwable) {
Result.failure(exception)
}
releaseIntercepted()
if (completion is BaseContinuationImpl) {
current = completion
param = outcome
} else {
// 调用 BlockingCoroutine 对象的 resumeWith 方法 进行判断协程是否完成了
completion.resumeWith(outcome)
return
}
}
}
}
执行 invokeSuspend 函数 ,打印 Hello
@Nullable
public final Object invokeSuspend(@NotNull Object var1) { // var1 为 Result<Unit>
IntrinsicsKt.getCOROUTINE_SUSPENDED();
// this.label 初始化值为 0
switch (this.label) {
case 0:
ResultKt.throwOnFailure(var1);
// this.L$0 是 BlockingCoroutine 对象
CoroutineScope $this$runBlocking = (CoroutineScope)this.L$0;
// 启动新的协程
BuildersKt.launch$default($this$runBlocking, (CoroutineContext)null, (CoroutineStart)null, (Function2)(new CoroutineKt$main$1$1((Continuation)null)), 3, (Object)null);
// 执行真的函数,先打印 Hello
System.out.println("Hello");
// 返回 Unit 对象
return Unit.INSTANCE;
default:
throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
}
}
// var0 为 BlockingCoroutine 对象 ,var1 为 null ,var2 为 null
// var3 为 CoroutineKt$main$1$1 对象 var4 为 3 ,var5 为 null
public static Job launch$default(CoroutineScope var0, CoroutineContext var1, CoroutineStart var2, Function2 var3, int var4, Object var5) {
return BuildersKt__Builders_commonKt.launch$default(var0, var1, var2, var3, var4, var5);
}
// var0 为 BlockingCoroutine 对象 ,var1 为 null ,var2 为 null
// var3 为 CoroutineKt$main$1$1 对象 var4 为 3 ,var5 为 null
public static Job launch$default(CoroutineScope var0, CoroutineContext var1, CoroutineStart var2, Function2 var3, int var4, Object var5) {
// 表达式为 true
if ((var4 & 1) != 0) {
var1 = (CoroutineContext) EmptyCoroutineContext.INSTANCE;
}
// 表达式为 true
if ((var4 & 2) != 0) {
var2 = CoroutineStart.DEFAULT;
}
return BuildersKt.launch(var0, var1, var2, var3);
}
// $this$launch 为 BlockingCoroutine 对象 ,context 为 EmptyCoroutineContext
// start 为 CoroutineStart.DEFAULT , block 为 CoroutineKt$main$1$1 对象
public static final Job launch(@NotNull CoroutineScope $this$launch, @NotNull CoroutineContext context, @NotNull CoroutineStart start, @NotNull Function2 block) {
return BuildersKt__Builders_commonKt.launch($this$launch, context, start, block);
}
// context 为 EmptyCoroutineContext ,start 为 CoroutineStart.DEFAULT
// block 为 CoroutineKt$main$1$1 对象
public fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job {
// context 为 EmptyCoroutineContext 对象 ,newContext 为 BlockingCoroutine 对象的coroutineContext
val newContext = newCoroutineContext(context)
val coroutine = if (start.isLazy) // start.isLazy 为 false
LazyStandaloneCoroutine(newContext, block) else
// 创建 StandaloneCoroutine 对象
StandaloneCoroutine(newContext, active = true)
// 调用 StandaloneCoroutine start 方法
coroutine.start(start, coroutine, block)
return coroutine
}
private open class StandaloneCoroutine(
parentContext: CoroutineContext,
active: Boolean
) : AbstractCoroutine<Unit>(parentContext, initParentJob = true, active = active) {
override fun handleJobException(exception: Throwable): Boolean {
handleCoroutineException(context, exception)
return true
}
}
StandaloneCoroutine 也是 AbstractCoroutine 对象 ,上面分析过 BlockingCoroutine 对象 start ,流程是一样的 最终调到 CoroutineKt$main$1$1 invokeSuspend 方法
public final Object invokeSuspend(@NotNull Object $result) {
Object var2 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
switch (this.label) { // this.label 默认为 0
case 0:
ResultKt.throwOnFailure($result);
Continuation var10001 = (Continuation)this;
this.label = 1; // this.label 设置为 1
// 调用 delay 函数 ,会返回 COROUTINE_SUSPENDED
if (DelayKt.delay(1000L, var10001) == var2) {
return var2;
}
break;
case 1:
ResultKt.throwOnFailure($result);
break;
default:
throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
}
System.out.println("World!");
return Unit.INSTANCE;
}
delay 是 suspend 函数
public suspend fun delay(timeMillis: Long) {
if (timeMillis <= 0) return // don't delay
return suspendCancellableCoroutine sc@ { cont: CancellableContinuation<Unit> ->
if (timeMillis < Long.MAX_VALUE) {
// 会获取到协程上下文中的 ContinuationInterceptor 作为 Delay 对象
// 也就是 BlockingEventLoop 对象,实现了 Delay 接口
cont.context.delay.scheduleResumeAfterDelay(timeMillis, cont)
}
}
}
internal val CoroutineContext.delay: Delay get() = get(ContinuationInterceptor) as? Delay ?: DefaultDelay
// 会调到 BlockingEventLoop 的 scheduleResumeAfterDelay 方法
override fun scheduleResumeAfterDelay(timeMillis: Long, continuation: CancellableContinuation<Unit>) {
val timeNanos = delayToNanos(timeMillis)
if (timeNanos < MAX_DELAY_NS) {
val now = nanoTime() // 获取当前时间
// 创建 DelayedResumeTask 对象
DelayedResumeTask(now + timeNanos, continuation).also { task ->
schedule(now, task) // 调用 schedule 方法
continuation.disposeOnCancellation(task)
}
}
}
private inner class DelayedResumeTask(
nanoTime: Long,
private val cont: CancellableContinuation<Unit>
) : DelayedTask(nanoTime) {
override fun run() { with(cont) { resumeUndispatched(Unit) } }
override fun toString(): String = super.toString() + cont.toString()
}
internal abstract class DelayedTask(
@JvmField var nanoTime: Long
) : Runnable, Comparable<DelayedTask>, DisposableHandle, ThreadSafeHeapNode, SynchronizedObject()
{}
fun schedule(now: Long, delayedTask: DelayedTask) {
when (scheduleImpl(now, delayedTask)) { // 调用 scheduleImpl 方法 返回 SCHEDULE_OK
SCHEDULE_OK -> if (shouldUnpark(delayedTask)) unpark()
SCHEDULE_COMPLETED -> reschedule(now, delayedTask)
SCHEDULE_DISPOSED -> {} // do nothing -- task was already disposed
else -> error("unexpected result")
}
}
private fun scheduleImpl(now: Long, delayedTask: DelayedTask): Int {
if (isCompleted) return SCHEDULE_COMPLETED
// _delayed 默认为空
val delayedQueue = _delayed.value ?: run {
// 初始化延时执行任务队列
_delayed.compareAndSet(null, DelayedTaskQueue(now))
_delayed.value!!
}
return delayedTask.scheduleTask(now, delayedQueue, this)
}
fun scheduleTask(now: Long, delayed: DelayedTaskQueue, eventLoop: EventLoopImplBase): Int = synchronized<Int>(this) {
if (_heap === DISPOSED_TASK) return SCHEDULE_DISPOSED
// 把 delayedTask 添加到延时队列 DelayedTaskQueue 中
delayed.addLastIf(this) { firstTask ->
if (eventLoop.isCompleted) return SCHEDULE_COMPLETED
// firstTask 默认 为空
if (firstTask == null) {
delayed.timeNow = now
} else {
val firstTime = firstTask.nanoTime
val minTime = if (firstTime - now >= 0) now else firstTime
if (minTime - delayed.timeNow > 0) delayed.timeNow = minTime
}
if (nanoTime - delayed.timeNow < 0) nanoTime = delayed.timeNow
true
}
// 返回 SCHEDULE_OK
return SCHEDULE_OK
}
BlockingCoroutine.joinBlocking()
- while 循环继续执行
processNextEvent()会拿到 nextTime 下一个延时队列队头的距离当前时间的值 , - 然后进行
LockSupport.parkNanos()进行阻塞, - 当阻塞时间到后会唤醒再次调用
processNextEvent() enqueueDelayedTasks()因为时间已经到了,会把延时任务加入到_queue队列中进行执行- 最终会再次调用
CoroutineKt$main$1$1对象的 invokeSuspend 方法 打印 World! - 当 task 和 延时的 task 都为空时 协程结束运行
override val nextTime: Long
get() {
if (super.nextTime == 0L) return 0L
val queue = _queue.value
when {
queue === null -> {} // empty queue -- proceed
queue is Queue<*> -> if (!queue.isEmpty) return 0 // non-empty queue
queue === CLOSED_EMPTY -> return Long.MAX_VALUE // no more events -- closed
else -> return 0 // non-empty queue
}
// 获取延时队列的时间 ,1000 毫秒
val nextDelayedTask = _delayed.value?.peek() ?: return Long.MAX_VALUE
return (nextDelayedTask.nanoTime - nanoTime()).coerceAtLeast(0)
}
public final Object invokeSuspend(@NotNull Object $result) {
Object var2 = IntrinsicsKt.getCOROUTINE_SUSPENDED();
// 由于上次已经调用过一次 this.label 为 1 了
switch (this.label) {
case 0:
ResultKt.throwOnFailure($result);
Continuation var10001 = (Continuation)this;
this.label = 1;
if (DelayKt.delay(1000L, var10001) == var2) {
return var2;
}
break;
case 1:
ResultKt.throwOnFailure($result);
break;
default:
throw new IllegalStateException("call to 'resume' before 'invoke' with coroutine");
}
// 阻塞 1000 毫秒后会打印 World!
System.out.println("World!");
return Unit.INSTANCE;
}
总结
上面代码比较复杂,总结起来就是以下运行逻辑
- runBlocking 函数 block 对象 打包为一个 Runnable 对象放入到 BlockingEventLoop 对象的任务队列中
// 第一个 Runnable 对象
{
launch {
delay(1000L)
println("World!")
}
println("Hello")
}
- 然后开启一个 while 循环 ,去读取 BlockingEventLoop 任务队列,执行第一个 Runnable 对象
- 碰到 launch 会开启一个协程 又包装成第二个 Runnable 对象放入到 BlockingEventLoop 的任务队列里 ,请注意并没有立即执行,所有并不会阻塞 Hello 的打印
// 第二个 Runnable 对象 { delay(1000L) println("World!") }- 然后打印 Hello
- while 循环 再次去 读取 BlockingEventLoop 任务队列 执行第二个 Runnable 对象,此时第二个 Runnable对象 this.label 为 0
- 当执行到 delay 函数时会创建一个延时 1000 毫秒的任务(还是第二个 Runnable 对象)添加到 BlockingEventLoop 延时任务队列 并且会把第二个Runnable 对象 成员变量 this.label 更改为 1
- 当阻塞时间到了 1000 毫秒 时,会把延时任务列表添加到任务列表中进行执行 ,再次执行第二个 Runnable 对象
- 当再次执行第二个 Runnable 对象,情况有了变化,this.label = 1 ,只会执行打印 World! ,而不会再次 delay
- 当BlockingEventLoop 任务队列执行完成退出 while 循环程序结束