首页 > 解决方案 > 同时运行 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 ")

标签: androidasynchronouskotlinkotlin-coroutines

解决方案


您正在用Dispatchers.Default作协程调度程序。引用文档

它由 JVM 上的共享线程池支持。默认情况下,此调度程序使用的最大线程数等于 CPU 内核数,但至少为两个。

根据您的 Logcat 输出,您似乎在四核 CPU 上运行,因为Dispatchers.Default线程池中似乎有四个线程。

欢迎您使用Executors.newThreadPoolExecutor()创建一个线程池,上面有更多线程,然后使用asCoroutineDispatcher()扩展函数Executor将其包装在 aCoroutineDispatcher中供您使用,而不是Dispatchers.Default. 但是,除非您的工作受 I/O 限制,否则这在移动设备上可能是不必要的。而且,对于 I/O 绑定的工作,您应该考虑Dispatchers.IO与它共享线程Dispatchers.Default但也使用一个辅助线程池,其中包含更多线程。


推荐阅读