Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 倒计时闩锁有什么好处?_Java_Scala_Concurrency - Fatal编程技术网

Java 倒计时闩锁有什么好处?

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 =&

我很欣赏CountDownLatch是一个线程安全类,可以帮助进行线程间通信。但是对于上面所示的用例,这并不是一个简单的问题

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()的在所有工作完成后调用请参阅我的响应-倒计时()应该在需要同步的操作完成后调用,这可能与线程完成时间一致,也可能不一致。我明白了,非常感谢您的详细解释:)我明白了,非常感谢您的详细解释:)