<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 協程簡介 ### 協程概述 一般情況下,在開發程序時會遇到一些耗時的操作,如網絡IO、文件IO、CPU/GPU密集型任務等,這些操作會阻塞線程直到操作完成。**線程阻塞問題除了通過開啟新線程來解決外,還可以使用協程來解決**。在Kotlin 1.1版本中引入了協程(Coroutines),目前協程還是實驗性功能,它是將復雜的異步操作放入底層庫中,程序邏輯可以在協程中按照順序來表達,以此簡化異步編程,該底層庫將用戶代碼包裝為回調/訂閱事件,在不同線程或者不同機器調度執行。協程主要有以下兩個特點。 * **協程掛起**:協程提供了一種使程序避免阻塞且更廉價可控的操作,叫作協程掛起(coroutines suspension),協程掛起不阻塞線程。 * **簡化代碼**:協程讓原來使用“異步+回調”方式寫出來的復雜代碼,簡化成可以用看似同步的方式表達。 由于協成還處于實驗階段,因此相關的Jar包不在標準庫中,需要手動導入。協成使用的Jar包為“kotlinx-coroutines-core”,可以在“https://github.com/Kotlin/kotlinx. coroutines”上下載這個包添加到項目中,也可以直接在build.gradle文件中的dependencies節點中添加這個包的依賴并通過網絡加載,一般使用dependencies節點中添加依賴的方式會比較快捷。在build.gradle文件中添加依賴的代碼如下。 ``` dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7' } ``` Kotlin中的協程還可以實現其他語言的異步機制,例如源于C#和ECMAScript(js)的async/await機制,源于Go的channel/select機制,源于C#和Python的generators/yield機制等。 ### 協程的定義 協程是由程序直接實現的一種輕量級線程,Kotlin也為此提供了標準庫和額外的實驗庫。標準庫為kotlin.coroutines.experimental(本書使用的是kotlin-1.20版本),但是協程仍然還是一個實驗性功能。 在Kotlin程序中,啟動一個協程的方式有很多種,例如通過launch()函數、runBlocking()函數(該函數會在后續章節中講解)等方式來啟動一個協程,最常用的方式是通過launch()函數來啟動協程。用launch()函數啟動協程的語法格式如下: ``` launch (CommonPool){ … } ``` 上述語法格式中,CommonPool是一個共享線程池。 接下來我們創建一個Gradle程序,在build.gradle文件中配置協程依賴`implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7'`,然后通過launch()函數啟動一個協程。具體代碼如下所示。 ``` import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.delay import kotlinx.coroutines.experimental.launch fun main(args: Array<String>) { //啟動一個協程 launch(CommonPool) { delay(1000L) println("Hello World") } Thread.sleep(2000L) } ``` 運行結果: ``` Hello World ``` ### 線程與協程實現對比 在Kotlin中操作比較耗時的程序時,使用線程會容易出現線程阻塞的情況,而啟用協程可以避免阻塞線程。接下來我們通過線程和協程兩種方式來實現一個延遲1秒后打印一個“hello”字符串的案例來進行對比分析。 #### 線程打印字符串 首先,通過線程的方式來實現延遲1秒打印一個“hello”字符串,具體代碼如下所示。 ``` fun main(args: Array<String>) { //延遲1秒鐘打印hello Thread( Runnable { Thread.sleep(1000L) println("hello") }).start() } ``` 運行結果: ``` hello ``` 上述文件的第5行代碼中,通過調用線程中的sleep()方法將程序延時1秒再執行,第7行中的start()方法用于開啟線程,從運行結果可知,程序延遲1秒后打印“hello”字符串。 需要注意的是,Thread.sleep(1000L)代碼在Java程序中,會出現異常并需要使用try…catch語句來處理這個異常,而在Kotlin中沒有受檢異常,因此在這里不需要使用try…catch語句來處理這個異常。 #### 協程打印字符串 首先在IDEA中創建一個Coroutine.kt文件,接著在該程序中的build.gradle文件中添加`“compile 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.3'”`依賴,最后在Coroutine.kt文件中,通過協程的方式來實現延遲1秒打印一個“hello”字符串。具體代碼如下所示。 ``` import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.delay import kotlinx.coroutines.experimental.launch fun main(args: Array<String>) { //用協程的方式實現 launch (CommonPool){ delay(1000L) //延遲1秒 println("hello") //打印hello字符串 } Thread.sleep(2000L) } ``` 運行結果: ``` hello ``` 在上述代碼中可以看到,第7行代碼是通過launch()函數來開啟一個協程,CommonPool是一個啟動協程的線程池。delay()方法主要實現延遲操作,這個方法中傳遞的參數是延遲的時間,在這里傳遞的是1000L,也就是1秒,這個方法與線程中的Thread.sleep()是類似的。 由于延遲1秒之后主線程已經結束,此時不會再打印hello字符串,因此如果想要打印hello字符串,則需要在主線程中通過線程的Thread.sleep()方法使主線程延遲2秒(2000L)之后結束,此時就可以打印hello字符串。 需要注意的是,協程主要還是運行在線程中的,因此協程不能代替線程。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看