Kotlin / anko多个异步任务

火095

我正在寻找一种并行启动多个任务并等待所有任务完成的简单方法。

考虑下面的C#示例:

private static void Main(string[] args)
{
    var urlList = new[] {"http://www.microsoft.com/", "http://www.google.com/", "http://www.apple.com/" };
    var result = GetHtml(urlList);
}

private static List<string> GetHtml(string[] urlList)
{
    var tasks = new List<Task>();
    var output = new List<string>();

    foreach (var url in urlList)
    {
        var task = new Task(() =>
        {
            var html = new WebClient().DownloadString(url);
            output.Add(html);
        });

        tasks.Add(task);

        //starts task in a separate thread (doesn't block anything)
        task.Start();
    }

    //waits for all tasks (running in parallel) to complete before exiting method
    Task.WaitAll(tasks.ToArray());

    return output;
}

GetHtml方法并行下载多个网页并返回html字符串列表。

如何使用kotlin / anko实现此目的?

private fun GetHtml(urlList: Array<String>): ArrayList<String> {

    val tasks = ArrayList<Future<Unit>>()
    val output = ArrayList<String>()

    for (url in urlList) {
        val task = async() {
            //some java-code that downloads html from <url>, doesn't matter for now
            output.add("html for $url")
        }
        tasks.add(task)
    }

    //this is NOT parallel execution
    for (task in tasks) {
        task.get()           
    }

    //tasks.getall() ?? 

    return output
}
火095

根据Michaelpdegand59的输入,这是一个可行的解决方案:

private fun GetHtml(urlList: Array<String>): ArrayList<String> {

    val pool = Executors.newFixedThreadPool(urlList.count())
    val countDownLatch = CountDownLatch(urlList.count())

    val output = ArrayList<String>()

    for (url in urlList) {  

        async(pool, {
            //some java-code that downloads html for <url>
            output.add("html for $url")
            countDownLatch.countDown()
        })      
    }

    countDownLatch.await()

    return output
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个异步任务

来自分类Dev

如何在Kotlin中异步对多个项目执行网络请求?

来自分类Dev

Kotlin / Anko 按钮 onClick 不起作用

来自分类Dev

Kotlin-从不返回布尔值的异步任务返回布尔值

来自分类Dev

Kotlin-从不返回布尔值的异步任务返回布尔值

来自分类Dev

收集Kotlin Coroutines中的多个异步结果,忽略带有超时的异常

来自分类Dev

收集Kotlin Coroutines中的多个异步结果,忽略带有超时的异常

来自分类Dev

收集Kotlin Coroutines中的多个异步结果,忽略带有超时的异常

来自分类Dev

Kotlin:多个命名伴侣对象

来自分类Dev

android:kotlin流多个事件

来自分类Dev

异步执行多个任务并等待它们完成

来自分类Dev

如何使$ q等待多个异步任务?

来自分类Dev

并行启动多个异步任务的最佳方法?

来自分类Dev

Windows Form卡在多个异步任务上

来自分类Dev

在Lein中异步运行多个任务

来自分类Dev

在Android中安排多个异步任务

来自分类Dev

在C#中异步执行多个任务

来自分类Dev

单元测试和多个异步任务

来自分类Dev

在Android中安排多个异步任务

来自分类Dev

在Android中管理多个异步任务

来自分类Dev

如何使$ q等待多个异步任务?

来自分类Dev

redux-saga:跟踪多个异步任务

来自分类Dev

Kotlin异步速度测试结果评估

来自分类Dev

Kotlin类的Gradle集成测试任务

来自分类Dev

具有可选异步依赖项的Kotlin异步处理

来自分类Dev

Kotlin将列表分为多个列表

来自分类Dev

具有多个参数的Kotlin setter

来自分类Dev

带有多个参数的 Kotlin 补全

来自分类Dev

在 Kotlin 中覆盖多个版本的构造函数