当前位置: 首页 > 知识库问答 >
问题:

如何从Firebase Java Admin SDK停止线程

花高爽
2023-03-14

通过运行https://github.com/firebase/firebase-admin-java/blob/master/src/test/java/com/google/firebase/database/integration/shutdownexample.java的示例代码

public class ShutdownExample {

  public static void main(String[] args) {
    final Semaphore shutdownLatch = new Semaphore(0);

FirebaseApp app =
    FirebaseApp.initializeApp(
        new FirebaseOptions.Builder()
            .setDatabaseUrl("https://admin-java-sdk.firebaseio.com")
            .build());

FirebaseDatabase db = FirebaseDatabase.getInstance(app);
db.setLogLevel(Level.DEBUG);
DatabaseReference ref = db.getReference();

ValueEventListener listener =
    ref.child("shutdown")
        .addValueEventListener(
            new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot snapshot) {
                Boolean shouldShutdown = snapshot.getValue(Boolean.class);
                if (shouldShutdown != null && shouldShutdown) {
                  System.out.println("Should shut down");
                  shutdownLatch.release(1);
                } else {
                  System.out.println("Not shutting down: " + shouldShutdown);
                }
              }

              @Override
              public void onCancelled(DatabaseError error) {
                System.err.println("Shouldn't happen");
              }
            });

try {
  // Keeps us running until we receive the notification to shut down
  shutdownLatch.acquire(1);
  ref.child("shutdown").removeEventListener(listener);
  db.goOffline();
  System.out.println("Done, should exit");
} catch (InterruptedException e) {
  throw new RuntimeException(e);
}

调用db.gooffline()后,仍有一些线程在运行:

参考处理程序终结器信号调度器FirebaseDatabaseWorker池-5-线程-1

怎么可能清洗呢?

共有1个答案

双恩
2023-03-14

脱机只意味着Firebase Realtime Database SDK不再进行联网。这并不意味着它的线程必须离开或者程序应该退出。如果您完成了工作并希望退出进程,请调用system.exit(0)

 类似资料:
  • 我通过创建固定数量的线程来使用执行器服务来进行HTTP GET数据检索。 当Tomcat停止时,我们会出现以下错误: 严重:web应用程序[/viewer]似乎已启动名为[ThreadExecutor_51616156]的线程,但未能停止该线程。这很可能会造成内存泄漏。 这是真的吗?在没有这些服务错误的情况下,如何正确停止tomcat。

  • 问题内容: 我已经用GUI制作了一个Java程序,并且想要一个停止按钮功能,其中当用户单击停止按钮时,必须停止该程序。 在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,所有10个线程都必须在主线程之前停止。 其次,我还希望每当停止这10个线程中的任何一个线程时,它都必须先关闭它打开的所有资源,然后再连接数据库等。 我已经实现了.......回答的代码。 现在有一个问题。 我的

  • 对不起,老问题。我已经澄清了。我如何用我可怜的线程类开始停止线程? 编辑:它在循环中,我想在代码开头再次重新启动它。我如何启动停止重新启动? 我的班级: 在主代码中,我希望:

  • 代码非常简单,我搜索了一下,发现我只会用到 这似乎不起作用,我也尝试过使用平台参数,比如 下面是您可以运行的测试应用程序: 锁定得可拥有同步器:-无 更新:我正在Linux Fedora 16 64bit上使用最新的Oracle JDK 7u17 64bit。

  • 我试图创建一个简单的pythongui(使用Tkinter),其中包含start按钮,在线程中运行while循环,以及停止while循环的stop按钮。 我对停止按钮有问题,它不会停止任何东西,一旦单击开始按钮,就会冻结GUI。 见下面的代码: 知道怎么解决这个问题吗?我肯定这是微不足道的,一定做了成千上万次,但我自己找不到解决办法。 谢谢大卫

  • 问题内容: 我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗? 问题答案: 做到这一点的好方法是让一个线程保护一个Thread的变量,并在你要停止它的时候将其设置为外部变量,例如: `class MyThread extends Thread { volatile boolean finished = false; public void stopMe(