【问题标题】:use of ConditionVariable in constructor [closed]在构造函数中使用 ConditionVariable [关闭]
【发布时间】:2014-09-17 07:07:15
【问题描述】:

此代码用作初始化实例的构造函数的一部分。 我想知道 ConditionVariable 的确切用途是什么?

我唯一的猜测是调用线程在初始化完成之前无法获得这个类的锁。我的想法对吗?

final ConditionVariable conditionVariable = new ConditionVariable();
new Thread() {
  @Override
  public void run() {
    synchronized (SimpleCache.this) {
      conditionVariable.open();
      initialize();
    }
  }
}.start();
conditionVariable.block();

这是完整代码的链接: https://github.com/google/ExoPlayer/blob/553a1d2ec15b3d34f76aff720d42de2f663eb55f/library/src/main/java/com/google/android/exoplayer/upstream/cache/SimpleCache.java

【问题讨论】:

  • 如果不显示 open 和 block 的代码,你会得到最好的结果是一个猜测......在构造函数中启动一个线程也很臭......
  • @assylias 这不是构造函数中的威胁。一个匿名的内部类扩展 Thread 类已创建并实例化,然后它就开始了
  • @KumarAbhinav - 你从哪里得到的信息?
  • @TheLostMind 如果你说的是外部类,那么线程可能是作为构造函数的一部分的内部类。我说的是内部类
  • @KumarAbhinav "此代码用作构造函数的一部分..."

标签: java android multithreading condition-variable


【解决方案1】:

如果没有其余代码,就无法确定,但看起来这是一种在后台线程上运行复杂初始化代码但仍然让主线程等待初始化完成的稍微笨拙的方法。对initialize() 的调用发生在后台,但conditionVariable.block() 一直等到它完成。

不过,我想知道重点是什么。如果.block() 调用确实阻塞了,那么它会占用主线程,就像直接初始化一样。也许.block() 会进行一些轮询,但也允许运行 GUI 事件之类的。没有代码很难确定...

【讨论】:

    猜你喜欢
    • 2013-08-26
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多