android - 同时运行 10 个 kotlin 异步协程
问题描述
我正在尝试同时运行 7 个异步协程,但似乎只有 4 个异步协程正在运行
btn.setOnClickListener(View.OnClickListener {
var urls = arrayOf(mUrl,mUrl2,mUrl3,mUrl4,mUrl5,mUrl5,mUrl5)
GlobalScope.launch(Dispatchers.Default) {
for(url in urls){
async { getlocationSourcecode(url) } // This is jsoup parsing html method
}
Log.i("MainActivity", " TEST : This Main coroutine is running in ${Thread.currentThread().name} thread ")
}
})
这是我的日志,你可以看到只有 4 个线程在工作
2020-05-02 16:52:15.177 11578-11578/com.example.android.iscrape I/MainActivity: TEST : This Main thread is running in main thread
2020-05-02 16:52:20.759 11578-11674/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-2 thread
2020-05-02 16:52:20.762 11578-11676/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-4 thread
2020-05-02 16:52:20.763 11578-11675/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-3 thread
2020-05-02 16:52:20.765 11578-11673/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-1 thread
2020-05-02 16:52:22.977 11578-11674/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-2 thread
2020-05-02 16:52:23.761 11578-11674/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-2 thread
2020-05-02 16:52:24.393 11578-11674/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-2 thread
2020-05-02 16:53:43.252 11578-11675/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-3 thread
2020-05-02 16:55:22.039 11578-11673/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-1 thread
2020-05-02 16:55:22.453 11578-11673/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-1 thread
2020-05-02 16:55:22.923 11578-11673/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-1 thread
2020-05-02 16:55:23.397 11578-11675/com.example.android.iscrape I/MainActivity: TEST : This asyncTask thread is running in DefaultDispatcher-worker-3 thread
2020-05-02 16:55:23.863 11578-11675/com.example.android.iscrape I/MainActivity: TEST : This Main coroutine is running in DefaultDispatcher-worker-3 thread
这是 jsoup 方法的初始部分,也解析 json
这里我记录了线程名称以检查有多少线程正在运行
suspend fun getlocationSourcecode(url: String) {
lateinit var trying: String
Log.i("MainActivity", "TEST : getDatax called ")
Log.i("MainActivity", " TEST : This asyncTask thread is running in ${Thread.currentThread().name} thread ")
解决方案
您正在用Dispatchers.Default
作协程调度程序。引用文档:
它由 JVM 上的共享线程池支持。默认情况下,此调度程序使用的最大线程数等于 CPU 内核数,但至少为两个。
根据您的 Logcat 输出,您似乎在四核 CPU 上运行,因为Dispatchers.Default
线程池中似乎有四个线程。
欢迎您使用Executors.newThreadPoolExecutor()
创建一个线程池,上面有更多线程,然后使用asCoroutineDispatcher()
扩展函数Executor
将其包装在 aCoroutineDispatcher
中供您使用,而不是Dispatchers.Default
. 但是,除非您的工作受 I/O 限制,否则这在移动设备上可能是不必要的。而且,对于 I/O 绑定的工作,您应该考虑Dispatchers.IO
与它共享线程Dispatchers.Default
但也使用一个辅助线程池,其中包含更多线程。
推荐阅读
- azure-devops-rest-api - 当触发器设置为无时使用 REST API 启动 azure-devops 管道
- tsql - CREATE TABLE ... AS SELECT 使用派生表
- android - Android/IOS Native WooCommerce Marketplace App 一般组织
- firebase - 无论输入或函数名称如何,httpsCallable 在使用 expo 运行模拟器并反应原生时都会返回错误:“internal”
- c# - 如何从列表中找到人的姓名
- python - 使用Python下载api数据
- reactjs - 在反应中处理复选框验证并从选中的复选框创建父/子对象
- azure - 何时应在 CosmosDB 中创建新容器?
- mysql - 组合 SQL 查询缺少操作数(错误 #1241)...我做错了什么?
- gridstack - Gridstack 删除特定元素