当前位置: 首页 > 面试题库 >

调用者阻塞直到getFoo()准备好值?

孟意致
2023-03-14
问题内容

我有一个Java Thread,它公开了其他线程要访问的属性:

class MyThread extends Thread {
   private Foo foo;
   ...
   Foo getFoo() {
     return foo;
   }
   ...
   public void run() { 
     ...
     foo = makeTheFoo();
     ...
   }
}

问题是从运行到foo可用为止需要花费很短的时间。呼叫者可以getFoo()在此之前致电并获得null。我希望它们只是在初始化发生后立即阻塞,等待并获取值。(foo此后永远不会更改。)直到准备就绪,这将需要几毫秒的时间,因此我对这种方法感到满意。

现在,我可以做到这一点,wait()并且notifyAll()有95%的机会我会做对的。但是我想知道你们所有人将如何做。有一种原始的java.util.concurrent,将做到这一点,我已经错过了?

或者,您将如何组织它?是的,使foo挥发。是的,同步一个内部锁Object,并将检查放入while循环中,直到不是null。我有什么想念的吗?


问题答案:

如果foo仅初始化一次,CountDownLatch则非常适合。

class MyThread extends Thread {

  private final CountDownLatch latch = new CountDownLatch(1);

  ...

  Foo getFoo() throws InterruptedException
  {
    latch.await(); /* Or use overload with timeout parameter. */
    return foo;
  }

  @Override
  public void run() {
    foo = makeTheFoo()
    latch.countDown();
  }

}

闩锁提供与volatile关键字相同的可见性行为,这意味着foo即使foo未声明,读取线程也会看到该线程分配的值volatile



 类似资料:
  • 问题内容: 我在中进行以下设置: 我正在使用包装将它们连接在一起。 这是传输层: 以及管道配置: 在中使用结果 如果我使用较大的连接尝试次数或增加连接重试次数来手动启动服务器,则该服务器最终将正常工作。如果我启动logstash并且过一会儿启动节点容器,它也可以工作。 问题在于,显然这不是一个好习惯,我无法猜测启动将花费多长时间,并且其中的指令根本没有帮助。 我需要一种方法来知道什么时候准备好,然

  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?

  • 本文向大家介绍node.js回调函数之阻塞调用与非阻塞调用,包括了node.js回调函数之阻塞调用与非阻塞调用的使用技巧和注意事项,需要的朋友参考一下 首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善。其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者

  • 问题内容: 我正在寻找一种方法来阻止直到a 为空。 我知道,在多线程环境中,只要有生产者将项目放入,就可能会出现队列变空并且几秒钟后队列中充满项目的情况。 但是,如果只有 一个 生产者,则它可能要等待(并阻止)直到队列停止为空后再将其放入队列。 Java /伪代码: 你有什么主意吗? 编辑 :我知道包装和使用额外的条件可以解决问题,我只是问是否有一些预制的解决方案和/或更好的选择。 问题答案: 使

  • 我刚刚开始学习vert. x,对它是如何工作的仍然感兴趣...我在想: 当反应性非阻塞垂直线卸载到阻塞垂直线时,阻塞垂直线在工作线程上运行。 1.what事件循环线程,关闭加载的工作,在同一时间?从循环中获取另一个事件? 返回a结果时,同一事件循环是否继续执行?还是另一个? 1的答案是什么 我觉得我错过了一些基本的东西,关于事情实际上是如何工作的。谢谢你的帮助!

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?