草庐IT

Android Looper 与 BlockingQueue?

coder 2023-11-21 原文

谁能解释为什么有人应该使用 Android Looper 功能来创建“管道线程”而不是创建从 BlockingQueue 中提取任务的普通线程?从表面上看,这似乎是做同一件事的两种方法。

最佳答案

BlockingQueue 允许您拥有多个消费者和生产者,而 Looper 机制允许您拥有多个生产者但只有一个消费者。

所以在 Looper 线程中你一次只能执行一个任务(runnable)。创建了循环机制,以便您可以在 UI 线程(作为单线程运行,因此可以将其视为单线程使用者)上轻松执行可运行对象(封装为消息的任务)

Looper/Handler 还提供延迟执行任务的功能,而开箱即用的 BlockingQueue 则没有。同样,这在 UI 工具包的上下文中很重要。

关于Android Looper 与 BlockingQueue?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439459/

有关Android Looper 与 BlockingQueue?的更多相关文章

  1. C++ 模板化生产者-消费者 BlockingQueue,无界缓冲区 : How do I end elegantly? - 2

    我写了一个BlockingQueue来让两个线程进行通信。您可以说它遵循生产者-消费者模式,具有无限缓冲区。因此,我使用临界区和信号量实现它,如下所示:#pragmaonce#include"Semaphore.h"#include"Guard.h"#includenamespaceDRA{namespaceCommonCpp{templateclassBlockingQueue{CCriticalSectionm_csQueue;CSemaphorem_semElementCount;std::queuem_Queue;//ForbidcopyandassignmentBlockin

  2. java - 为什么 iterator.hasNext 不适用于 BlockingQueue? - 2

    我试图在BlockingQueue上使用迭代器方法,发现hasNext()是非阻塞的-即它不会等到添加更多元素,而是在没有元素时返回false。下面是问题:这是糟糕的设计还是错误的期望?有没有办法使用阻塞BLockingQueue的方法与它的父Collection类方法(例如,如果某些方法期望一个集合,我可以通过一个阻塞吗排队希望其处理将等到队列有更多元素)这是一个示例代码块publicclassSomeContainer{publicstaticvoidmain(String[]args){BlockingQueuebq=newLinkedBlockingQueue();SomeCo

  3. java - 可调整大小的 Java BlockingQueue - 2

    所以我在生产者/消费者类型的应用程序中使用固定大小的BlockingQueue[ArrayBlockingQueue],但我希望用户能够动态更改队列大小。问题是没有允许在创建后更改容量的BlockingQueue实现。以前有人遇到过这个吗?有什么想法吗? 最佳答案 最明显的解决方案(可能合适也可能不合适,具体取决于您的情况)是简单地实例化一个具有您想要的更新容量的新队列。然后将旧队列中的所有内容推送到新队列中。 关于java-可调整大小的JavaBlockingQueue,我们在Stac

  4. java - 当线程被中断时,BlockingQueue 方法是否总是抛出 InterruptedException? - 2

    在我的一个Java6应用程序中,我有一个线程向主线程提供数据,同时还从数据库中预取更多记录。它使用ArrayBlockingQueuequeue作为一个FIFO缓冲区,它的主循环是这样的:while(!Thread.interrupted()){if(source.hasNext()){try{queue.put(source.next())}catch(InterruptedExceptione){break;}}else{break;}}有些代码会在循环终止后进行一些清理,例如污染队列和释放任何资源,但这几乎就是全部。就目前而言,没有从主线程到供给线程的直接通信:供给线程使用适当的

  5. java - BlockingQueue.take 在什么情况下会抛出中断异常? - 2

    让我们假设我有一个线程消耗另一个线程生成的项目。它的run方法如下,inQueue是一个BlockingQueuebooleanshutdown=false;while(!shutdown){try{WorkItemw=inQueue.take();w.consume();}catch(InterruptedExceptione){shutdown=true;}}此外,不同的线程将通过中断正在运行的线程来发出没有​​更多工作项的信号。如果take()不需要阻塞来检索下一个工作项,它将抛出一个中断的异常。即,如果生产者发出信号表示它已完成填充工作队列,是否有可能不小心将某些项目留在inQ

  6. java - 如何立即释放等待 BlockingQueue 的线程 - 2

    考虑一个BlockingQueue和一些等待poll(long,TimeUnit)的线程(可能也在take()上)。现在队列是空的,需要通知正在等待的线程可以停止等待了。预期的行为是返回null或抛出声明的InterruptedException。Object.notify()不适用于LinkedBlockingQueue,因为线程正在等待内部锁。有什么直接的方法吗? 最佳答案 BlockingQueue的Javadoc提出了一个好方法:ABlockingQueuedoesnotintrinsicallysupportanykind

  7. c++ - BlockingQueue 的 QWaitCondition : Destroyed while threads are still waiting - 2

    我在Qt中构建了自己的阻塞队列,但遇到了一些问题。如果我不关闭队列,那么我会在控制台中收到错误消息“QWaitCondition:线程仍在等待时已销毁”。另一方面,我在关闭队列后收到访问冲突异常(无论它是在构造函数中还是来自另一个线程)。异常发生在等待条件的wait方法中。这是我的阻塞队列:#ifndefBLOCKING_QUEUE_H#defineBLOCKING_QUEUE_H#include#include#include#include#includenamespaceConcurrency{templateclassBlockingQueue{private:QMutex_m

  8. Android Looper 与 BlockingQueue? - 2

    谁能解释为什么有人应该使用AndroidLooper功能来创建“管道线程”而不是创建从BlockingQueue中提取任务的普通线程?从表面上看,这似乎是做同一件事的两种方法。 最佳答案 BlockingQueue允许您拥有多个消费者和生产者,而Looper机制允许您拥有多个生产者但只有一个消费者。所以在Looper线程中你一次只能执行一个任务(runnable)。创建了循环机制,以便您可以在UI线程(作为单线程运行,因此可以将其视为单线程使用者)上轻松执行可运行对象(封装为消息的任务)Looper/Handler还提供延迟执行任务

  9. java - 如何自定义 BlockingQueue 的阻塞行为 - 2

    我想创建一个阻塞队列,它根据自定义规则而不是队列中的项目数来阻塞生产者。例如:生产者生产一些文件并放入队列中。消费者经过一些分析后将它们转移到特定位置。对于上述场景,我希望生产者在队列中的总文件大小达到某个阈值时等待生成新文件。如果总大小不超过阈值,队列可以接受任意数量的文件。 最佳答案 我可能会将BlockingQueue子类化,例如ArrayBlockingQueue并添加一个简单的CountDownLatch,它被初始化为阈值并在达到0时启用各种take/remove方法。 关于j

  10. java - 为什么 ThreadPoolExecutor 的参数是 BlockingQueue? - 2

    我尝试使用创建和执行ThreadPoolExecutorintpoolSize=2;intmaxPoolSize=3;ArrayBlockingQueuequeue=newArrayBlockingQueue(2);如果我连续尝试第7、8...个任务threadPool.execute(task);队列达到最大大小后它开始抛出“RejectedExecutionException”。意味着我失去了添加这些任务。那么这里BlockingQueue如果缺少任务,它的作用是什么?意思是为什么它不等待?来自BlockingQueue的定义AQueuethatadditionallysuppor

随机推荐