arrays - Kotlin中的多线程数组初始化

标签 arrays multithreading matrix multidimensional-array kotlin

说,我有以下允许我创建矩阵的函数:

inline fun <reified T> Matrix2D(w: Int, h: Int, init: (Int, Int) -> T) =
    Array(w){ x -> Array(h){ y -> init(x, y) } }

inline fun <reified T> Matrix2D(w: Int, h: Int, value: T) =
    Array(w){ Array(h){ value } }

// For example:
val m = Matrix2D(400, 400) { x, y ->
    Color(x.toDouble() / 400.0, y.toDouble() / 400.0, 0.0)
}

我也不想允许可为空性,因为稍后处理元素访问会很痛苦。

我如何使用多个线程/协程初始化这样的矩阵,其中每个线程/协程都会初始化自己的矩阵图块,而又不考虑矩阵单元的可空性?

最佳答案

是的,您可以并行创建一个Matrix2D,例如:

val threads = Matrix2D(10, 3){x, y-> Thread.currentThread() }.flatten().distinct()

//              v--- size > 1
println(threads.size)
inline fun <reified T> Matrix2D(w: Int, h: Int, crossinline init: (Int, Int) -> T)=
       //                     v--- create array in parallel
       generatorOf(w){x -> Array(h) {y -> init(x, y) } }.map{ it() }.toTypedArray()
       //                          get the final result `Matrix2D` ---^

//                     v--- create array generator
inline fun <reified T> generatorOf(size: Int, crossinline init:(Int) -> T) = 
  //v--- you can use `ForkJoinPool#commonPool`, but it will run task in work thread
   ForkJoinPool(20).let {
       Array(size) { i -> it.submit(Callable { init(i) }).let { { it.get() } } }
       //                 return the lambda generator ()->T  ---^
   }

您还可以编写扩展功能toArray来删除中间的map操作并提高性能,例如:
inline fun <reified T> Matrix2D(w: Int, h: Int, crossinline init: (Int, Int) -> T)=
        //                         v--- init array elements in parallel
        generatorOf(w) { x -> Array(h) { y -> init(x, y) } }.toArray{it()}
        //           transform to the `Matrix2D` directly  ---^

//                                v--- convert Array<T> to Array<R>
inline fun <T,reified R> Array<T>.toArray(transform:(T)->R):Array<R>{
    return Array(size){i->transform(get(i))}
}

为什么在外部数组初始化中做了Matrix2D启动线程,您可以进一步了解sum two double[][] with parallel stream

关于arrays - Kotlin中的多线程数组初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45439765/

相关文章:

c - 在c中初始化字符串数组的不同方法

php laravel 返回 foreach 中的所有数据

php - 如何使用递归函数返回 true

java - 为什么线程不在本地缓存对象?

multithreading - 从 UIView 制作 UIImage 但不在主线程中

c - 访问存储在一维数组中的二维数组中的对角线元素

c - C 中的指针和重新分配

java - Android 中可中断的 ScheduledExecutorService

python - 没有 numpy 的零和一矩阵

python - 如何将 2D 数组连接到每个 3D 数组中?