如何解决从线程获取返回值,此Kotlin代码线程安全吗?
我想踩一下踏板,等到所有踏板都踩完,然后得到结果。
可能的方法是在下面的代码中。线程安全吗?
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)
}
P.S。
Kotlin中是否有更好的内置工具来做到这一点?喜欢处理10个线程池中的10000个任务吗?
它应该是线程,而不是协程,因为它将与遗留代码一起使用,我不知道它是否与协程一起很好地工作。
解决方法
好像Java拥有Executors
正是这样做的
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() }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。