Tag: 队列

我该如何处理Java中的multithreading?

我正在研究与Java相关的实际场景;套接字程序。 现有系统和预期系统如下。 现有系统 – 系统检查是否满足某个条件。 如果是这样它将创建一些要发送的消息并将其放入队列中。 队列处理器是一个单独的线程。 它会定期检查队列中是否存在项目。 如果找到任何项目(消息),它只是将消息发送到远程主机(硬编码)并从队列中删除该项目。 预期的系统 – 就是这样的。 在满足特定条件时创建消息,但在每种情况下接收者都不相同。 所以有很多方法。 将消息放入同一队列但使用其接收者ID。 在这种情况下,第二个线程可以识别接收器,以便可以将消息发送到该接收器。 有多个线程。 在这种情况下,当满足条件并且接收器处于“新”状态时,它会创建一个新队列并将消息放入该队列。 并且新线程初始化以处理该队列。 如果下一个消息被定向到同一个接收者,它应该放在同一个队列中,如果不是新队列,则应该创建该线程。 现在我想实现第二个,有点卡住了。 我该怎么做? 骨架就足够了,您不必担心如何创建队列等… 🙂 更新:我也认为方法1是最好的方法。 我读了一些关于线程的文章并做出了这个决定。 但是,了解如何实施方法2也是非常值得的。

在Java中处理链中的作业排队

我目前正在java中设计一个关联引擎,它从pdf文件中提取数据,并在关系数据库中关联(必要时提醒警报)结构化数据。 该系统专注于处理pdf文件,包括: 从pdf执行自定义提取的组件。 将有时无序的不清洁数据解析为所需数据结构的组件 一个归一化组件,它将对值进行标准化以进行比较 以及与db接口的组件(其中提取的数据将与其余数据一起插入) 组件应该可以在其他处理链中重复使用,但它们最初都在同一系统上运行。 我认为在组件之间进行某种缓冲是明智的,使用JMS队列是明智的还是会使问题复杂化? 我一直在试验一个简单的linkedblockingqueue对象,但是这个对象必须在组件之间传递,所以它需要一个主组件来驱动我不确定所需的一切,是否有一种标准的方法来解决这个问题?

将设备数据与Web服务器同步

我的应用程序中有数据,必须根据网络可用性在服务器上更新。 我使用sqlite将这些数据存储在android上的本地数据库中。 目前的想法是: 应将数据插入本地sqlite数据库 插入数据后,服务应该等待它检查网络可用性并将其发送到服务器并等待成功响应。 如果从服务器收到响应true,它应该更新该sqlite行的同步状态并移动到下一行以发送数据。 我想找出将此数据排队以将其发送到服务器的最佳方法,此外,当网络不可用时,此队列应停止向服务器发送数据。 由于java中有许多队列可用,因此最好保存这些数据。 由于数据可以增长到任何无限大小。 这就像生产者 – 消费者问题,但解决它的最有效方法是什么。 提前致谢。

删除PriorityQueue的顶部?

假设我正在使用Java.util中的PriorityQueue类。 我想从PriorityQueue pq中删除最大的数字,我们假设它位于队列的头部。 以下工作会怎样? // 1 int head = pq.peek(); pq.dequeue(head); // 2 int head = pq.dequeue(pq.peek()); 对于非原始人来说,它的工作原理是否相同?

没有队列的ThreadPoolExecutor

我想创建一个固定大小的线程池,不允许任何任务进入其队列。 换句话说,如果当前正在使用线程池,则应该完全拒绝传入的任务。 基于文档 ,在我看来,实现此目的的一种方法是创建一个拒绝接受任务的虚拟Queue对象。 在Java中实现这一目标的惯用方法是什么?

如何自定义BlockingQueue的阻塞行为

我想创建一个阻塞队列,它根据自定义规则而不是队列中的项目数来阻止生产者。 例如: 生产者生成一些文件并放入队列。 一些分析后,消费者将它们转移到特定位置。 对于上面的场景,如果队列中的总文件大小达到某个阈值,我希望生产者等待生成新文件。 如果总大小不超过阈值,则队列可以接受任意数量的文件。

何时使用队列而不是arraylist

在ArrayList上使用Queue的一个基本参数是Queue保证FIFO行为。 但是,如果我向ArrayList添加10个元素,然后从第0个元素开始迭代元素,那么我将按照添加它们的顺序检索元素。 基本上,这保证了FIFO行为。 与传统的ArrayList相比,Queue有什么特别之处?

生产者/消费者 – 生产者将数据添加到集合中而不会阻塞,消费者会批量使用集合中的数据

我有一个生产者/消费者用例,这有点不寻常。 我有一些真实世界的用例,我希望他们能够在没有阻塞的情况下将对象添加到集合中。 消费者(只有一个)应该阻止,直到集合中有一定数量的对象可用(例如500),然后批量消费它们。 虽然少于500,但它应该阻止并等待集合填充。 我不介意队列是否超过这个值(700,1000等)很短的时间。 我目前似乎没有找到解决这个确切问题的解决方案。 我正在考虑使用ConcurrentLinkedQueue并让消费者定期检查队列是否有足够的数据,但这似乎适得其反。 另一个想法是使用LinkedBlockingQueue。 生产者不会阻止(除非队列已满,这意味着它有Integer.MAX_VALUE值 – 这不是我的情况,所以这一切都很好)。 使用者将执行queue.take()并将元素添加到内部集合中。 当内部集合达到500个元素时,它将批量使用它们。 你有什么建议吗? 谢谢!

SQL更新语句的Java单工作线程

我正在研究一个基于Java的服务器,我将在其中拥有多个线程(每个连接用户一个线程+一些额外的线程)。 将涉及一些数据库连接,所以我想每次服务器对数据库进行SELECT查询时,它将为此启动一个新线程,以防止阻塞当前线程。 我打算为此使用连接池,我想我知道如何做到这一点。 (我已经研究过C3P0 )但是,也会涉及很多UPDATE语句,但是这些语句直接运行并不重要,这里有延迟。 因为可能有很多UPDATE语句,所以我想为所有UPDATE语句设置一个工作线程。 在我看来,这将具有能够重用PreparedStatement -objects的优势 问题:我如何从其他线程告诉UPDATE -worker线程运行一些语句? 我知道multithreading以及如何使用synchronized块让线程彼此“交谈”,但是随着涉及的数据库,它突然感觉更复杂。 我已经读过不应该在线程之间共享准备好的语句和连接。 我现在就如何解决它的想法:(感觉不是一个好的解决方案) 使用自定义类的LinkedBlockingQueue (或其他类型的Queue),其中包含要调用哪种UPDATE语句以及要将其发送到哪些参数的信息。 然后工作线程将在通知时从该队列中读取(当将某些内容添加到队列时),并且它将运行适当的方法,该方法将使用相应的预准备语句,设置参数并调用它。 编辑:一个不好的想法,我认为自己采用这种方法是params可能是int,String,double或者其他什么。 如何将它们存储在自定义类中? 将它们全部存储为String感觉不太好。 我是在正确的轨道上还是有更好的方法来解决这个问题?

LinkedBlockingQueue的Java性能问题

这是我在stackoverflow上的第一篇文章…我希望有人可以帮助我 我使用Java 6 LinkedBlockingQueue进行了很大的性能回归。 在第一个线程中,我生成了一些我推入队列的对象。在第二个线程中,我将这些对象拉出来。 当频繁调用LinkedBlockingQueue的take()方法时, take()发生性能回归。 我监控整个程序, take()方法总体上take()了最多的时间。 吞吐量从~58Mb / s到0.9Mb / s …… 队列弹出并使用此类中的静态方法调用方法 public class C_myMessageQueue { private static final LinkedBlockingQueue x_queue = new LinkedBlockingQueue( 50000 ); /** * @param message * @throws InterruptedException * @throws NullPointerException */ public static void addMyMessage( C_myMessageObject message ) throws InterruptedException, NullPointerException { x_queue.put( message ); […]