java Firebase:延迟退出,直到写入完成

时间:2014-09-29 04:35:10

标签: java multithreading concurrency firebase

我有一个用Java编写的服务器,它可以在收听,处理和更新Firebase数据时收到关闭信号。由于Firebase线程是Java中的守护程序线程,因此我想在主线程中添加一些延迟以允许完成写入操作。

我目前的想法是锁存方法:使用一些并发计数器来跟踪挂起的写操作,并让主线程在没有时退出。计数器会在onComplete()回调中更新,所以我想知道:

在Firebase客户端中,何时可能会调用onComplete()回调?是否存在死锁的合理危险?

2 个答案:

答案 0 :(得分:5)

取自this google group discussion。这使用布尔done(在这种情况下为线程安全操作的AtomicBoolean)和while循环。

import com.firebase.client.Firebase;
import com.firebase.client.FirebaseError;

import java.util.Date;
import java.util.concurrent.atomic.AtomicBoolean;

public class Demo {

    public static void main(String[] args) {
        final AtomicBoolean done = new AtomicBoolean(false);
        Firebase ref = new Firebase("https://testjava.firebaseio-demo.com/");
        ref.setValue(new Date().toString(), new Firebase.CompletionListener() {
            @Override
            public void onComplete(FirebaseError firebaseError, Firebase firebase) {
                done.set(true);
            }
        });
        while (!done.get());
    }
}

答案 1 :(得分:1)

我认为您应该分三个阶段关闭服务器:

  1. 停止接受更多工作
  2. 等待所有工作完成
  3. 当工作计数器为0时,
  4. 关闭到守护程序线程池。
  5. 在写作任务中使用finally时,应确保始终调用onComplete()

    try {
       //write
    }
    finally {
       callbackObject.onComplete();
    }