Java 阻塞队列使用场景

Java 阻塞队列使用场景,java,multithreading,queue,blocking,blockingqueue,Java,Multithreading,Queue,Blocking,Blockingqueue,我正在进行一项设计,处理catch块中捕获的所有异常,并通过webservice调用发送到服务器 这样做的目的是在执行此任务时根本不阻止主应用程序。我觉得阻塞队列模式适合它。因此,我使用大小为10的数组实现创建了一个阻塞队列。在主应用程序开始时,我正在为此队列初始化一个消费者线程 然而,制作人方面对我来说有点困惑。根据我的理解,如果队列已满,并且如果主应用程序遇到异常,则执行producer.put(对象)将被阻止,直到队列有空间,因此主应用程序也将被阻止。这是正确的理解吗?是的,你是正确的。这

我正在进行一项设计,处理catch块中捕获的所有异常,并通过webservice调用发送到服务器

这样做的目的是在执行此任务时根本不阻止主应用程序。我觉得阻塞队列模式适合它。因此,我使用大小为10的数组实现创建了一个阻塞队列。在主应用程序开始时,我正在为此队列初始化一个消费者线程


然而,制作人方面对我来说有点困惑。根据我的理解,如果队列已满,并且如果主应用程序遇到异常,则执行producer.put(对象)将被阻止,直到队列有空间,因此主应用程序也将被阻止。这是正确的理解吗?

是的,你是正确的。这里有一个非常有用的例子
通常情况下,有一个有边界的队列是好的,但是限制不应该太低。

我认为,您应该将异常写入手机存储(如果是Android,则为SharedReferences),而不是保存在主内存中。 首先,它不会阻止你的主应用程序


在网络连接的回拨中,启动一个线程,该线程将读取共享首选项并将其发送到服务器。

是,生产者线程将被阻止,直到消费者线程从队列中取出一个。嗯,这不好,因为catch块将被挂起,这意味着主应用程序也将被挂起。这是用于移动应用程序的,所以不想让它导致内存不足问题。因此保持了10年的保守。但是它会阻止我通过创建匿名线程来执行队列操作吗?100甚至1000也太多了,因为在移动应用程序中可能没有网络连接,在这种情况下,您无法向服务器发送异常。我建议您使用
offer(e)
,因为如果出现网络错误或重新启动服务器,您的生产线程可能会被阻止。此外,您还可以为
offer(e)
返回
false
的情况设置一些计数器,如果大于0,则不时将其刷新到服务器。对于消费者而言,这是一个好主意,可以拨打电话,如果由于网络问题而失败,则将其推送到本地sqllite db。这样以后就可以从DB.Good choièè重试它们,然后它可能看起来像这样“如果(!queue.offer(e)){//write-into-sqllite}其中一个chellange是这样的,假设主应用程序中有人向服务器打了大约20个电话,并且所有20个都由于服务器关闭等原因而失败。然后我结束了20个队列操作,并说队列已满。然后,所有20个都将在sql db中结束。此本地sql db是一个单线程实例。因此,它仍然会导致主应用程序的延迟。当设备未连接到网络时,本地sqlLite DB确实是处理这种情况所必需的组件。但是,写入DAO的成本很高,而且它是一个单线程数据库,因此在生成太多异常的情况下,整个系统将无法承受。请同步DAO方法,并使用AsyncTasks将异常写入数据库。这意味着只允许在AsyncTask上向DB写入异常,而不会挂起主应用程序,因为我们正在使用AsyncTasks。