Пул потоков Java с одним потоком не работает должным образом - PullRequest
0 голосов
/ 08 июля 2019

Я создаю исполнитель пула потоков только с одним потоком и использую метод Kotlin asCoroutineDispatcher () в программе Kotlin. Когда я запускаю несколько сопрограмм из цикла и записываю имя потока, я вижу разные имена - pool1-thread1, pool3-thread1, pool9-thread-1 и т. Д. Почему существует несколько потоков, когда я использовал один поток для пула? Котлин по-разному управляет пулом потоков?

// this is executed in loop
fun executeTask(url: String) {
    GlobalScope.launch {
        val result = runAsync(url)
        Log.d("coroutineCheck", "$url\t\tStatus:$result")
    }
}
//some blocking n/w IO goes in this method
//I log the thread name here
suspend fun runAsync(url: String): String = withContext(Executors.newFixedThreadPool(1).asCoroutineDispatcher()) {

}

1 Ответ

4 голосов
/ 08 июля 2019

Вы звоните newFixedThreadPool каждый раз, когда вызываете свой метод, многократно создавая новые пулы.

Вы хотите использовать одного и того же исполнителя.

// singleton to put somewhere, may also need to shut it down eventually
val dispatcher = Executors.newFixedThreadPool(1).asCoroutineDispatcher()

suspend func runAsync(url: String): String = withContext(dispatcher){ ... }
...