2012-03-31 49 views
3

我的代码:块当前线程

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; 
     } 

似乎对我的工作的权利,但我不熟悉线程(它总是让我困惑),应我以任何方式执行上述代码?

回答

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循环是一个很好的模式。

+0

我想你错过了'fetched.set(true);' – 2012-03-31 14:25:21

+0

是啊谢谢@Peter。我删除了使用提取的需要。 – Gray 2012-03-31 14:26:51

+0

我会将更新/检查的字段移动到同步块中。在这种情况下,它很简单,但在更复杂的情况下,它将是必要的。 – 2012-03-31 14:28:15

4

你有两个问题

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

取而代之,最简单的模式是锁定对象并在值更改时等待/通知。