首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从线程获取返回值,这个Kotlin代码线程安全吗?

从线程获取返回值,这个Kotlin代码线程安全吗?
EN

Stack Overflow用户
提问于 2020-08-14 18:47:09
回答 1查看 664关注 0票数 0

我想跑一些踏板,等到所有的踏板都完成了,就会得到结果。

可能的方法是在下面的代码中实现。但是它是线程安全的吗?

代码语言:javascript
运行
复制
import kotlin.concurrent.thread

sealed class Errorneous<R>
data class Success<R>(val result: R) : Errorneous<R>()
data class Fail<R>(val error: Exception) : Errorneous<R>()

fun <R> thread_with_result(fn: () -> R): (() -> Errorneous<R>) {
  var r: Errorneous<R>? = null
  val t = thread {
    r = try { Success(fn()) } catch (e: Exception) { Fail(e) }
  }
  return {
    t.join()
    r!!
  }
}

fun main() {
  val tasks = listOf({ 2 * 2 }, { 3 * 3 })
  val results = tasks
    .map{ thread_with_result(it) }
    .map{ it() }
  println(results)
}

附注:

在Kotlin中有没有更好的内置工具来做到这一点?比如处理10000个任务,有10个线程的池?

它应该是线程,而不是协程,因为它将与遗留代码一起使用,我不知道它是否与协程一起工作得很好。

EN

回答 1

Stack Overflow用户

发布于 2020-08-14 20:43:52

看起来Java有Executors可以做到这一点

代码语言:javascript
运行
复制
fun <R> execute_in_parallel(tasks: List<() -> R>, threads: Int): List<Errorneous<R>> {
  val executor = Executors.newFixedThreadPool(threads)
  val fresults = executor.invokeAll(tasks.map { task ->
    Callable<Errorneous<R>> {
      try { Success(task()) } catch (e: Exception) { Fail(e) }
    }
  })
  return fresults.map { future -> future.get() }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63411285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档