package com.abc.test
import org.junit.Assert
import org.junit.Test
import java.util.concurrent.CountDownLatch
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
class CountDownLatchTest {
/**
* CountDownLatch是一个用来做多线程同步的工具。它有一个初始数量,
* 方法countDown()调用一次数量减一.
* await()方法会阻塞一直等到数量为0.
*/
@Test
fun testCountDownLatch1() {
//设置为1个.
val countDownLatch = CountDownLatch(1)
val pools = Executors.newFixedThreadPool(100)
pools.execute {
Thread.sleep(2000)
countDownLatch.countDown()
println("" + countDownLatch.count)
Assert.assertEquals(countDownLatch.count, 0)
}
pools.execute {
//等待计数为0.也就是等待第一个线程执行完毕.
println("i am waiting")
countDownLatch.await()
println("i am here")
println("" + countDownLatch.count)
Assert.assertEquals(countDownLatch.count, 0)
}
pools.shutdown()
pools.awaitTermination(10, TimeUnit.SECONDS)
}
/**
* count为3
* 使用4个线程,
* 可以确认第三个线程是最后执行的.
*/
@Test
fun testCountDownLatch2() {
//设置为1个.
val countDownLatch = CountDownLatch(3)
val pools = Executors.newFixedThreadPool(4)
pools.execute {
Thread.sleep(1000)
countDownLatch.countDown()
println("1:" + countDownLatch.count)
}
pools.execute {
Thread.sleep(2000)
countDownLatch.countDown()
println("2:" + countDownLatch.count)
}
pools.execute {
//等待计数为0.也就是等待第一个线程执行完毕.
println("3:i am waiting")
countDownLatch.await()
println("3:i am here")
println("3:" + countDownLatch.count)
}
pools.execute {
countDownLatch.countDown()
println("4:" + countDownLatch.count)
}
pools.shutdown()
pools.awaitTermination(100, TimeUnit.SECONDS)
}
}
史上最简单的CountDownLatch入门教程
最新推荐文章于 2024-01-30 22:11:27 发布