Kotlin中可以很方便的使用自定义线程池作为协程上下文,并且可以在不使用CountDownLatch
跟Callable
+
Future
的情况下更简单的实现主线程等待线程池中任务执行完毕的需求。
首先我们将协程的依赖加入pom.xml
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-core</artifactId>
<version>1.2.2</version>
</dependency>
然后新建Test.kt,内容如下:
import kotlinx.coroutines.asCoroutineDispatcher
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.util.concurrent.Executors
fun main() {
runBlocking {
//创建自定义线程池
val coroutineDispatcher = Executors.newFixedThreadPool(3).asCoroutineDispatcher()
launch {
//在父协程中创建子协程
repeat(5) {
//使用自定义线程池执行协程
async(coroutineDispatcher) {
Thread.sleep(1000)
println("${Thread.currentThread().name}")
}
}
}.join()//等待子协程执行完毕
//关闭自定义线程池
coroutineDispatcher.close()
println("子协程执行完啦!!!!")
}
}
以上代码中首先创建了一个3个线程的定长线程池,然后经由launch
创建一个同步协程作为父协程,接着在父协程内部循环创建了5个使用自定义线程池的异步子协程,最终由父协程的join()
方法实现等待子协程全部执行完毕。当然,千万记得关闭线程池,以免造成不必要的资源浪费;建议将自定义线程池作为全局变量重复利用。
未经允许不得转载:鹞之神乐 » Kotlin 协程使用自定义线程池