[TOC]

文章转自:https://blog.csdn.net/vitaviva/article/details/108554692

概述

多线程开发中,经常会遇到这样的需求:Task1、Task2 等多个任务并行执行,等待全部执行完成后,执行Task3。
我们在Kotlin种可以有多种方法实现,在这里一并列举一下:

在这里插入图片描述

  1. Thread.join
  2. Synchronized
  3. ReentrantLock
  4. BlockingQueue
  5. CountDownLatch
  6. CyclicBarrier
  7. CAS
  8. Future
  9. CompletableFuture
  10. Rxjava
  11. Coroutine

Task3基于 Task1、Task2返回的结果,拼接字符串,每个任务都通过sleep模拟耗时操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val task1: () -> String = {
sleep(2000)
"Hello".also { println("task1 finished: $it") }
}

val task2: () -> String = {
sleep(2000)
"World".also { println("task2 finished: $it") }
}

val task3: (String, String) -> String = { p1, p2 ->
sleep(2000)
"$p1 $p2".also { println("task3 finished: $it") }
}

Thread.join()

Kotlin兼容Java,所以Java的所有工具都可以使用。本case中最简单的方式就是使用Thread的join方法实现同步:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Test
fun test_join() {
lateinit var s1: String
lateinit var s2: String

val t1 = Thread { s1 = task1() }
val t2 = Thread { s2 = task2() }
t1.start()
t2.start()

t1.join()
t2.join()

task3(s1, s2)

}