2017-12-01 28 views
1

私はKotlin Coroutinesで実験し、次のコードを持っている:ローマElizarovの別のコルーチンにanswer関連の質問によるとマルチスレッド使用Kotlinコルーチン

number of cores: 4 
async number:0 on thread ForkJoinPool.commonPool-worker-2 
async number:2 on thread ForkJoinPool.commonPool-worker-3 
async number:3 on thread ForkJoinPool.commonPool-worker-3 
async number:4 on thread ForkJoinPool.commonPool-worker-3 
async number:5 on thread ForkJoinPool.commonPool-worker-3 
async number:1 on thread ForkJoinPool.commonPool-worker-1 
async number:7 on thread ForkJoinPool.commonPool-worker-3 
async number:6 on thread ForkJoinPool.commonPool-worker-2 
async number:9 on thread ForkJoinPool.commonPool-worker-3 
async number:8 on thread ForkJoinPool.commonPool-worker-1 

fun main(args: Array<String>) = runBlocking { 
    val cores = Runtime.getRuntime().availableProcessors() 
    println("number of cores: $cores") 

    val jobs = List(10) { 
     async(CommonPool) { 
      delay(100) 
      println("asynC#$it on thread ${Thread.currentThread().name}") 
     } 
    } 
    jobs.forEach { it.join() } 
} 

は、これは私の出力であります

「このコルーチンは新しいコルーチンを作成しますが、CommonPoo l コルーチンを複数の スレッドを使用するForkJoinPool.commonPool()に送り、この例では複数のCPUで実行されます。の数に等しいデフォルトで ;別個またはカスタムプールを必要とするアプリケーションの場合

」、 ForkJoinPoolが所定の目標並列レベルで構成することができる:ジャワ8 documentationによれば

利用可能なプロセッサ。

なぜ3つのワーカースレッドが使用されているのですか?非同期タスクの数を1000以上に増やしても、同じ3つのワーカースレッドがあります。

マイ設定:(Hyper-threadingと、このように4つの見えコア)デュアルコアCPUを搭載した マック/ハイシエラ、Kotlin 1.2、kotlinx-コルーチンコア:0.19.3とJVM 1.8

答えて

2

あなたが見ればCommonPoolの実装では、あなたはそれが以下のサイズでjava.util.concurrent.ForkJoinPoolまたはスレッドプールに取り組んだことがわかります:

(Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1) 

4使用可能なプロセッサでは、これはあなたが3つのワーカースレッドを参照してくださいなぜ答えた3になります。

次のように-sizeは(同じになります)を決定することができるForkJoinPool:もちろん

ForkJoinPool.commonPool().parallelism 
+0

私はそれを見逃している... :)ありがとうございます! –