1. CountDownLatch 代码示例
CountDownLatch
将代码的执行通过CountDownLatch#await
的方法切成多块,以满足时序的要求
import java.util.concurrent.CountDownLatch
object Driver {
val N: Int = 5
def main(args: Array[String]): Unit = {
val startSignal = new CountDownLatch(1)
val doneSignal = new CountDownLatch(N)
1.to(N).foreach{ id =>
new Thread(new Worker(id, startSignal, doneSignal)).start()
}
startSignal.countDown()
println("start:")
doneSignal.await()
}
}
class Worker(id: Int, startSignal: CountDownLatch, donwSignal: CountDownLatch) extends Runnable {
override def run(): Unit = {
try {
startSignal.await()
doWork()
donwSignal.countDown()
}
}
def doWork(): Unit = {
println(s"work $id is running")
}
}
time | driver | worker |
---|---|---|
startSignal.await() |
||
startSignal.countDown() |
||
doneSignal.await() |
||
donwSignal.countDown() |
2. scala实现类似的写法
object CountDownLatchDemo {
import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
def main(args: Array[String]): Unit = {
val n = 5
val workerFutures = 1.to(n).map{ id =>
Future{
println(s"work $id is running")
}
}
val driverFuture = Future.sequence(workerFutures)
Await.result(driverFuture, 10.seconds)
println("all done")
}
}
网友评论