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

时间:2012-03-31 14:20:41

标签: 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;
        }

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

2 个答案:

答案 0 :(得分: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();
     }
  }
  ...

我认为你根本不需要获取AtomicBoolean。您应该rowCountvolatile,然后您可以测试其值。由于生产者/消费者的竞争条件和虚假中断,while循环是一个很好的模式。

答案 1 :(得分:4)

你有两个问题

  • 第一个线程忙于等待,这通常是不受欢迎的。
  • 模式无法扩展到更多线程,因为第二个线程可能会尝试将值设置为true。

相反,最简单的模式是锁定一个对象,并在值改变时等待/通知。