Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.time.LocalTime
- import kotlin.random.Random
- fun main() {
- println("Array's size:")
- val m = readLine()!!.trim().toInt()
- println("Threads amount")
- val n = readLine()!!.trim().toInt()
- val arr = IntArray(m) { Random.nextInt(1000) }
- /*println("Array: ")
- arr.forEach { print("$it ") }.apply(::println)*/
- // --------------------------------------- SINGLE ---------------------------------------
- val res1 = {
- val start = LocalTime.now().nano
- val res = arr.sum()
- val finish = LocalTime.now().nano
- println("Single thread: ${maxOf(start, finish) - minOf(start, finish)}")
- res
- }()
- // --------------------------------------- MULTI ---------------------------------------
- val res2 = {
- val start = LocalTime.now().nano
- val _d = m / n
- val numsInThreads = IntArray(n) { _d }
- val ost = m % n
- (0 until ost).forEach { numsInThreads[it]++ }
- var cur = 0
- var res = 0
- val threads = Array(n) { Thread() }
- val _a = Any()
- numsInThreads.forEachIndexed { ind, numsAmount ->
- val _cur = cur
- threads[ind] = Thread {
- var subRes = 0
- val f = _cur + numsAmount
- (_cur until f).forEach { subRes += arr[it] }
- synchronized(_a) { res += subRes }
- }.apply(Thread::start)
- cur += numsAmount
- }
- threads.forEach(Thread::join)
- val finish = LocalTime.now().nano
- println("Multi thread: ${maxOf(start, finish) - minOf(start, finish)}")
- res
- }()
- if (res1 != res2) throw Exception("Sums are not equal")
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement