Java 倒计时闩锁有什么好处?
我很欣赏CountDownLatch是一个线程安全类,可以帮助进行线程间通信。但是对于上面所示的用例,这并不是一个简单的问题Java 倒计时闩锁有什么好处?,java,scala,concurrency,Java,Scala,Concurrency,我很欣赏CountDownLatch是一个线程安全类,可以帮助进行线程间通信。但是对于上面所示的用例,这并不是一个简单的问题 object Main extends App { val poolSize = 2 val executor = Executors.newFixedThreadPool(poolSize) val doneSignal = new CountDownLatch(poolSize) (0 until poolSize).foreach{ i =&
object Main extends App {
val poolSize = 2
val executor = Executors.newFixedThreadPool(poolSize)
val doneSignal = new CountDownLatch(poolSize)
(0 until poolSize).foreach{
i => executor.submit(new Work(doneSignal, i))
}
executor.shutdown()
println("Work submitted")
doneSignal.await()
println("Work completed")
}
class Work(doneSignal:CountDownLatch, id:Int) extends Runnable {
override def run(): Unit = {
println(s"Starting $id : ${Thread.currentThread().getName}")
Thread.sleep(3000)
println(s"Ending $id : ${Thread.currentThread().getName}")
doneSignal.countDown()
}
}
够了吗?在您的示例中,使用这两种方法应该没有区别 初始化为N的倒计时锁存器可用于使一个线程等待 直到N个线程完成某个操作或某个操作已完成N次 线程不需要完成执行——只需要按照同步要求完成某些操作——它们使用latch.countDown()表示完成 对于示例如果在呈现UI之前从5个web服务获取数据,则可以在单独的线程中执行。一旦数据可用,渲染就可以开始,但您的各个线程仍会继续执行,以对该数据执行一些簿记操作 ExecutorService.awaitTermination()要求线程完成执行。在您的情况下,它们的工作原理类似,但在下面的示例中,它们不会
executor.awaitTermination(1, TimeUnit.DAYS)
带等待终止的输出
Starting thread pool-1-thread-1
Starting thread pool-1-thread-2
Pre-Notification work completed pool-1-thread-1
Pre-Notification work completed pool-1-thread-2
Finishing Execution
Post-Notification Work Completedpool-1-thread-1
Post-Notification Work Completedpool-1-thread-2
在您的示例中,使用这两种方法应该没有区别 初始化为N的倒计时锁存器可用于使一个线程等待 直到N个线程完成某个操作或某个操作已完成N次 线程不需要完成执行——只需要按照同步要求完成某些操作——它们使用latch.countDown()表示完成 对于示例如果在呈现UI之前从5个web服务获取数据,则可以在单独的线程中执行。一旦数据可用,渲染就可以开始,但您的各个线程仍会继续执行,以对该数据执行一些簿记操作 ExecutorService.awaitTermination()要求线程完成执行。在您的情况下,它们的工作原理类似,但在下面的示例中,它们不会
executor.awaitTermination(1, TimeUnit.DAYS)
带等待终止的输出
Starting thread pool-1-thread-1
Starting thread pool-1-thread-2
Pre-Notification work completed pool-1-thread-1
Pre-Notification work completed pool-1-thread-2
Finishing Execution
Post-Notification Work Completedpool-1-thread-1
Post-Notification Work Completedpool-1-thread-2
你和doneSignal在这里干什么?你的意思是用doneSignal.await()替换waitTermination吗?是的,你是对的,对代码进行了更改。我不认为在这个示例中会有任何区别,但是如果在doneSignal.countDown()之后有代码在工作,那么它就会不同。我以为整个想法是针对doneSignal.countDown()的要在所有工作完成后调用请参阅我的响应-倒计时()应在需要同步的操作完成后调用,该操作可能与线程完成时间一致,也可能与线程完成时间不一致。您在这里使用doneSignal做什么?你的意思是用doneSignal.await()替换waitTermination吗?是的,你是对的,对代码进行了更改。我不认为在这个示例中会有任何区别,但是如果在doneSignal.countDown()之后有代码在工作,那么它就会不同。我以为整个想法是针对doneSignal.countDown()的在所有工作完成后调用请参阅我的响应-倒计时()应该在需要同步的操作完成后调用,这可能与线程完成时间一致,也可能不一致。我明白了,非常感谢您的详细解释:)我明白了,非常感谢您的详细解释:)