阻止当前线程执行,直到另一个线程更新变量

Cai*_*der 3 java multithreading

我的代码:

    private  AtomicBoolean fetched1 = new AtomicBoolean(false);

    private int  rowCount;

    public int getRowCount() {
            data.getRealm().exec(new Runnable(){
                @Override
                public  void run() {
                    rowCount = data.size();
                    fetched1.set(true);
                }
            });
            while(!fetched1.get()){
            }
            fetched1.set(false);
            return rowCount;
        }
Run Code Online (Sandbox Code Playgroud)

它现在似乎对我有用,但我不熟悉线程(它总是让我困惑),我应该像上面的代码那样做吗?

Gra*_*ray 7

我应该像上面的代码那样做吗?

这看起来是一个旋转循环,将使用不必要的CPU.最好使用waitnotify发出数据已被提取的信号.就像是:

   private final Object lock = new Object();
   private volatile Integer rowCount = null;
   ...

      public void run() {
         rowCount = data.size();
         synchronized (lock) {
            lock.notify();
         }
      }

  synchronized (lock) {
     // we loop here in case of race conditions or spurious interrupts
     while (rowCount == null) {
        lock.wait();
     }
  }
  ...
Run Code Online (Sandbox Code Playgroud)

我觉得你根本不需要取物AtomicBoolean.你应该制作rowCountbe volatile然后你可以测试它的价值.while由于生产者/消费者竞争条件和虚假中断,循环是一个很好的模式.