【问题标题】:How to write a recursive coroutines in kotlin如何在 kotlin 中编写递归协程
【发布时间】:2017-09-25 15:12:37
【问题描述】:

我想在 kotlin 中编写一个更快的文件搜索器来查找我的主文件夹下的所有文本文件。

这是我的序列搜索代码

import java.io.File
import java.util.concurrent.atomic.AtomicLong

var count: AtomicLong = AtomicLong(0)

fun main(args: Array<String>) {
  println(System.getProperty("user.home"))

  val start = System.currentTimeMillis()
  findTxtFile(System.getProperty("user.home") + "/git", ".txt")

  println("took: " + (System.currentTimeMillis() - start))

  println(count.get())
}


fun findTxtFile(path: String, extension: String) {
  File(path).listFiles().forEach {
    if (it.isDirectory) {
      findTxtFile(it.absolutePath, extension)
    } else if (it.name.endsWith(extension)) {
      count.getAndIncrement()
    }
  }
}

我写了一个程序,但是当你有很多文件时,它会抛出NullPointerException,怎么可能抛出空指针异常?

import kotlinx.coroutines.experimental.CommonPool
import kotlinx.coroutines.experimental.async
import kotlinx.coroutines.experimental.runBlocking
import java.io.File

fun main(args: Array<String>) {
    val start = System.currentTimeMillis()
    var filePath = System.getProperty("user.home")
    var deferred = File(filePath).listFiles().map { path ->
        async(CommonPool) {
            findTxtFile(path.absolutePath)
        }
    }

    runBlocking {
        deferred.map {
            it.await()
        }
    }
    println((System.currentTimeMillis() - start) / 1000)
}

suspend fun findTxtFile(path: String) {
    //println("--------------------- $path")
    if (File(path).isDirectory) {
        File(path).listFiles().forEach {
            findTxtFile(it.absolutePath) //===> Exception happen here
        }
    } else if (path.endsWith(".java")) {
        println(path)
    }
}

【问题讨论】:

  • 所以你已经写好了代码。您的实际问题是什么?
  • 这是单线程,如何在kotlin中使用协程使其更快?

标签: kotlin kotlinx.coroutines


【解决方案1】:

您不需要 fun findTxtFile(path: String) 成为 suspend。删除该修饰符,它将起作用。 suspend 修饰符允许你在方法内部使用协程,但你没有任何协程内部 - 所以它是不必要的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-16
    • 2019-10-03
    • 2017-12-01
    • 2023-04-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    相关资源
    最近更新 更多