Kotlinコルーチン(1)基本的な理解


I.は、コルーチン(コルーチン)kotlinスレッド切り替えフレーム

代表的なアプリケーション:

  • コルーチンを開き、指定されCoroutineContexのコルーチンのコンテキスト(スレッドプールのスレッドを含む等)
  • ;さらに内部コルーチン(この操作未満)、機能ペンディング(複数)、マルチスレッドオペレーションコード(複数)などを含みます
  • 体験吊り機能、それが機能を停止する機能スイッチスレッドに入りますスレッドを指定、および実装後、元のスレッドへのカットバックを継続します。

II。楽しいサスペンド機能サスペンド

サスペンド機能、コルーチンがハング、ハングを、代わりにブロックします。
最も直接的な使用がメインスレッドであり、保留中の機能が発生し、関数内の保留中の実行に入ります。

機能をサスペンド、コルーチンはスレッドを指定された場合、スレッドは動作を切り替えます。
機能が完了したサスペンド関係なくカットの糸を切断しない、それは下方に継続します。
それがコルーチンAの子で指定されたスレッドをカットする場合、スレッドが終了するまでしかし、それは完全に実装されることはありません。(そのようなものの使用などThreadThreadPoolExecutorスレッドを開始します)

デコンパイルとしてパッケージ化機能、サスペンド、参照Continuationにより、オブジェクトをContinuation#resumeWith(result:Result<T>)、その結果を取得しresult.isFailure/isSuccess、実行した後、再び後に保留外部関数の結果を得るために、機能障害/成功を一時停止します。

自分自身をサスペンド機能が中断されていることを確認することはできません。コルーチンと組み合わせて使用し、またはその他の保留中に操作を実行する機能を一時停止します。
サスペンド機能、コルーチンが中断または別の関数呼び出し、究極の目標、またはコルーチンを実行するようにされる必要です。

suspend fun m() {
	//withContext 是一个挂起函数
	withContext(Dispatchers.IO) {
		...
	}
}

手持ちコルーチンは、(必ずしもスレッド切り替えない)機能を一時停止したら機能実行サスペンドまで流れ落ちないコルーチンコードを中断します。

withContextは()、kotlinは、サスペンド機能を提供しました:

public suspend fun <T> withContext(
		context: kotlin.coroutines.CoroutineContext, 
		block: suspend kotlinx.coroutines.CoroutineScope.() -> T
	) : T {   }

III。コルーチンを作成します

。コルーチンスコープCoroutineScope

CoroutineScopeの作成:

  • runBlocking()ブロッキング。機能の実行を保留して、すべての内部サブコルーチンが完了するまで待機します。インテリアは、作成BlockingCoroutineコルーチンオブジェクトをブロック
  • MainScope()具体的な標準ライブラリの実装は、(文句を言うでしょうコンソールのデモを書く)はありません。アンドロイドがあります。コルーチンスコープのメインスレッド。
  • GlobalScopeオブジェクトクラス。グローバルスコープ。それは、父・レベルの非グローバルスコープをキャンセルし、キャンセルされません。
  • カスタム実装
class MyCoroutineScope(
		override val coroutineContext: CoroutineContext
	) : CoroutineScope

CoroutineScope 拡張機能:

  • launch()ノンブロッキング。デフォルトでは、依存CoroutineContext CoroutineScopeです。仕事に戻ります。StandaloneCoroutine内部は(仕事を実装し、継続、CoroutineScope)オブジェクトを作成します。
  • async()ノンブロッキング。これは、新しいCoroutineContextを作成します。内部はDeferredCoroutineオブジェクトを作成します(彼らは繰延、仕事、継続、CoroutineScope DefaultDispatcher)

B。打ち上げ()

public fun kotlinx.coroutines.CoroutineScope.launch(
		context: kotlin.coroutines.CoroutineContext, 
		start: kotlinx.coroutines.CoroutineStart, 
		block: suspend kotlinx.coroutines.CoroutineScope.() -> kotlin.Unit
	) : kotlinx.coroutines.Job {  }

:パラメータについて
context:CoroutineContextコルーチンのコンテキスト
start:CoroutineStartコルーチンスタートモード
block:一時停止、CoroutineScope、匿名の拡張機能。内部関数によってcoroutineScope(block){}作成するCoroutineScopeコルーチンスコープオブジェクトを。
注:CoroutineScope()関数の拡張文と同じ、ない関数名。しかし、テスト見つけ、コールブロックを介して、実際には、そう呼び出すときには、機能ブロックがCoroutineScopeオブジェクト作成され、CoroutineScopeオブジェクトを渡す必要です。
私は、例を書きました

fun test(v: Int, block: Int.()  -> Double) {
   println(block(v * 2)) //println 2048.0
}
fun calc(a: Int): Double {
   return (a shl 10) * 1.0 //2<<10 = 2048
}
test(1) {
   calc(this)
   //18.5
}

コールINTパラメータを渡すテスト()、および関数、すなわち{CALC(本)}これは、試験パラメータの全体ブロックである
テスト()実装、印刷ブロック()戻り値は、ブロック状のIntを必要としますvは2に乗算されるパラメータ、
ブロック<==> {CALC(これは)}、このときこの= 2で、関数を計算値2048.0後に得られる。
最後に、戻り値は2048.0のprintlnある(ブロック)をリアクション場合「18.5」open文は、それは()の戻り値をブロックしていること。結果は戻り値としてコードの行を続くkotlin文法、。
 

C。非同期()

public fun <T> kotlinx.coroutines.CoroutineScope.async(
		context: kotlin.coroutines.CoroutineContext, 
		start: kotlinx.coroutines.CoroutineStart, 
		block: suspend kotlinx.coroutines.CoroutineScope.() -> T
	): kotlinx.coroutines.Deferred<T> { }

D。runBlocking()

public fun <T> runBlocking(
		context: kotlin.coroutines.CoroutineContext,  
		block: suspend kotlinx.coroutines.CoroutineScope.() -> T
	): T {  }

声明、文脈におけるこれらの機能は、すべてのデフォルト値を与え始めます。
コンテキスト:CoroutineContext = EmptyCoroutineContext、
スタート:CoroutineStart = CoroutineStart.DEFAULT、

すなわちコルーチンスタートモードCoroutineStart

public enum class CoroutineStart {
    DEFAULT, 						//默认的模式,立即执行协程体
    LAZY,							//只有在需要的情况下运行
    @ExperimentalCoroutinesApi		//实验性 协程 api
    ATOMIC,							//
    @ExperimentalCoroutinesApi
    UNDISPATCHED;					//
}

F。ジョブ

主なメンバ関数:

  • jon()待機コルーチンが実行されます。(同様のスレッド#)が(参加します)
  • cancel()コルーチンをキャンセルします。保留中のすべての機能が解約されているコルーチン。彼らは、小切手のコルーチンをキャンセルし、CancellationExceptionがキャンセルにスローされます。
  • cancelAndJoin()インサイド)は、(最初​​の(キャンセル)してから参加しています。完全にキャンセル待ちます

グラム。繰延

これは、ジョブのサブインタフェースです。ありますawait()
await()サスペンド機能である、それは戻り値の型<T>を持っています。
それを呼び出し、その結果Tを取得するために実装した後、コルーチンを中断されます

時間。ディスパッチャスケジューラ

自己CoroutineContextを達成。

public actual object Dispatchers {
	public actual val Default: CoroutineDispatcher = createDefaultDispatcher()
	public actual val Main: MainCoroutineDispatcher get() = 
			MainDispatcherLoader.dispatcher
	public actual val Unconfined: CoroutineDispatcher = 
			kotlinx.coroutines.Unconfined
	public val IO: CoroutineDispatcher = DefaultScheduler.IO
}

UIスレッドそのエネルギー利用における主なアンドリュース、コンソールを使用することはできませんが、実装されていません。
ディスパッチャスレッドIO内部スレッドプール、ディスクまたはネットワークI / O集約を実行するステップと、
ディスパッチャスレッドの内部スレッドプールデフォルト、CPU集約を行う。
一軸無制限

私。その他の機能は、サスペンド

  • delay()コルーチンが中断されたどのように多くのミリ秒。(同様のThread.sleep())
  • yield()可能であれば、他の協力プログラムに利用可能な現在のコルーチンのディスパッチャ・スレッド(またはスレッドプール)。(同様Thread.yield())。次の例では、インターリーブされ出力されます。
// 同是 Main、Default、Unconfined,才会在 yield 切换运行的协程时,在同一线程中。
// IO 会创建新线程。 Default 内部是一个线程池。
runBlocking {
    launch(Dispatchers.Unconfined, CoroutineStart.LAZY) {
        for (i in 0..3) {
            println("aaaa ${Thread.currentThread().name}")
            yield()
        }
    }
    launch(Dispatchers.Unconfined, CoroutineStart.LAZY) {
        for (i in 0..3) {
            println("bbbb  ${Thread.currentThread().name}")
            yield()
        }
    }
}

IV。使用方法

  • 最初(同時に、それは内部コルーチンを作成する)コルーチンスコープを作成します
  • コルーチンスコープ、(もちろん、機能を中断するさらにサブコルーチンがあってもよい)機能をサスペンド通常コードに加えて、および他のコルーチンを含んでいてもよいです
  • あなたはCoroutineContext、ディスパッチャ、CoroutineStartを指定することができます
  • )((選択するために使用されるlanuch)または非同期;コルーチン操作を取り消し、参加、または結果を待つする必要が
    繰延仕事サブクラスも操作をキャンセルする、参加あり、これ
  • withContextは保留機能です。これを使用するには、すなわち、のawait操作コルーチンはキャンセル、参加し気にしません

公開された400元の記事 ウォンの賞賛364 ビュー162万+

おすすめ

転載: blog.csdn.net/jjwwmlp456/article/details/104859936