【问题标题】:Is it ok if a worker thread that pulls from a BlockingQueue never exits in android?如果从 BlockingQueue 中提取的工作线程永远不会在 android 中退出,可以吗?
【发布时间】:2013-07-03 20:20:32
【问题描述】:

我有一个基本上看起来像这样的线程:

public void run() throws InterruptedException {
   while(true) {
         String curUrl = taskQueue.take();
         ...
   }
}

我知道我可以将 true 更改为 volatile 变量,并在我不再需要它时将其设置为 false,但它在我的整个应用程序中使用,因此很难判断何时不再需要它。

我想知道如果即使我的应用程序未运行,无限循环仍处于阻塞状态,是否会对 Android VM 其余部分的性能产生明显影响。

编辑 1:启动线程的代码只会在它尚未运行时启动它。

【问题讨论】:

  • 如果你不断启动和停止你的应用程序,这些东西会不断累积吗?

标签: java android concurrency


【解决方案1】:

因为 taskQueue 是一个阻塞队列,所以没有。让这个线程在应用程序的整个生命周期中运行不会造成任何明显的影响。

如果 TaskQueue 不是阻塞,那么它会阻塞。您的应用程序将尽可能快地消耗几乎整个核心的处理能力循环。

阻塞队列将导致调用方法“take”的线程停止,直到有一些结果可以返回。非阻塞队列会返回 null 或抛出异常。

【讨论】:

  • 由于take() 方法是在BlockingQueue 接口中定义的,而不是在Queue 中,我认为我们可以安全地假设队列是阻塞队列。
【解决方案2】:

Android 将在您的应用程序不被使用时终止它的进程,这将包括终止您的等待线程,因此通常在用户切换到其他任务后它不会停留很长时间。如果很难知道何时不再需要它,我不会担心它。

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多