我使用UDP套接字形式的数据包排队到android中的链接阻塞队列。对于单个队列,使用两个线程,一个线程负责将元素加入队列,另一个负责将元素出队。对于入队和出队线程,都使用< code>while(true)循环。然而,入队线程中的< code>while(true)不会消耗大量内存,如android studio profiler所示。我推测这是由于< code > UDP socket . receive(packet)性质的阻塞性质。最好的部分是具有< code>while(true)的入队线程消耗了大约0 %的内存,如android profiler所示。然而,< code >出列线程消耗了大约15%的内存,如下面的屏幕截图所示。出队线程的代码片段如下所示
while (true) {
if (!linkedBlockingQueue_A.isEmpty()) {
String data = (String) linkedBlockingQueue_A.element();
// System.out.println(data);
// parsing the data
String[] tupleData = data.split(",");
Integer sensor_id = Integer.valueOf(tupleData[0]);
Integer tuple_id = Integer.valueOf(tupleData[1]);
Long generation_time = Long.valueOf(tupleData[4]);
Long sensor_data = Long.valueOf(tupleData[5]);
Long event_arrival_time = Long.valueOf(tupleData[6]);
Long event_ingestion_time = nanoTime();
// define stream ecg_stream (sensorID int, tupleID int, ecg_value float , event_ingestion_time_ecg long, event_arrival_time_ecg long);";
// sending data to siddhi server
inputHandlerA.send(new Object[]{sensor_id, tuple_id, sensor_data,generation_time, event_arrival_time , event_ingestion_time });
linkedBlockingQueue_A.remove();
}
我认为需要的是在出列线程中加入一些阻塞特性,以避免轮询导致的内存消耗。由于我使用多个插座,我的设备“html" target="_blank">google pixel”在几个小时的操作后非常热,我不得不关闭它几个小时。
欢迎任何建议
这个问题已经解决了,因为我发现queue.take()
就是我要找的。因为它检索并删除由这个双端队列表示的队列的头部(换句话说,这个双端队列的第一个元素),如果需要,等待直到一个元素可用。下面是更新的代码。
while (true) {
String data = (String) linkedBlockingQueue_A.take();
// parsing the data
String[] tupleData = data.split(",");
Integer sensor_id = Integer.valueOf(tupleData[0]);
Integer tuple_id = Integer.valueOf(tupleData[1]);
Long generation_time = Long.valueOf(tupleData[4]);
Long sensor_data = Long.valueOf(tupleData[5]);
Long event_arrival_time = Long.valueOf(tupleData[6]);
Long event_ingestion_time = nanoTime();
// define stream ecg_stream (sensorID int, tupleID int, ecg_value float , event_ingestion_time_ecg long, event_arrival_time_ecg long);";
// sending data to siddhi server
inputHandlerA.send(new Object[]{sensor_id, tuple_id, sensor_data,generation_time, event_arrival_time , event_ingestion_time });
//
}
对于相同的while(true),
由于take()
方法的阻塞/等待性质,利用率很低
问题内容: 我想创建某种线程应用程序。但是我不确定在两者之间实现队列的最佳方法是什么。 因此,我提出了两个想法(这两个想法可能都是完全错误的)。我想知道哪种更好,如果它们都烂了,那么实现队列的最佳方法是什么。我关心的主要是这些示例中队列的实现。我正在扩展一个内部类的Queue类,它是线程安全的。下面是两个示例,每个示例有4个类。 主班 消费阶层 生产者类别 队列类 要么 主班 消费阶层 生产者类别
我有一个消费者作为生产者消费者模式的一部分: 简化: 如果我移除 通过将线程设置为睡眠,CPU使用率攀升到极高的水平(13%),而不是0%。 此外,如果我实例化该类的多个实例,则每个实例的CPU使用率都会以13%的增量攀升。 大约每分钟(可能每30秒)都会向BlockingCollection添加一个新的LogItem,并将适用的消息写入文件。 有没有可能线程以某种方式阻止了其他线程的运行,而系统
我们使用activemq作为Java独立应用程序的消息队列。我的问题是,基于activemq web控制台,队列有一定数量的消息排队和出列。但是,根据我在代码中添加的sysout语句,应用程序消耗的消息数似乎少于activemq web控制台上显示的消息数。例如,在activemq控制台上,没有。排队和出列的消息约为1800条。但是,在控制台上显示的出列消息数(我每接收一条消息就增加一个计数器)只
生产者线程与消费者线程使用信号量同步 生产者线程与消费者线程使用信号量同步 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2018-08-24 yangjie the f
问题内容: 我正在研究有关Java中线程的生产者和消费者设计模式,最近我在Java 5中进行了探索,引入Java 5中引入了BlockingQueue数据结构。现在,它变得更加简单,因为BlockingQueue通过引入阻塞方法隐式地提供了此控件。 put()和take()。现在,您无需使用等待和通知即可在生产者和消费者之间进行通信。如果有界队列,则如果Queue已满,BlockingQueue
我试图用阻塞队列实现一些消费者-生产者问题。为了达到某种目的,我决定编写文件搜索工具。 我认为搜索机制是递归工作的,每个新目录都将有新的线程池来提高搜索速度。 我的问题是,我不知道如何实现最终停止打印线程(消费者)的机制——当搜索线程完成工作时。 我试图用一些想法来做到这一点,比如毒丸,但它效果不佳(线程在打印任何结果之前停止)。任何想法我该怎么做? 下面是一些代码: 搜索机制: } 打印机: }