当前位置: 首页 > 知识库问答 >
问题:

使用生产者-消费者类型队列时如何避免出列线程中的高CPU利用率

裘光启
2023-03-14

我使用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”在几个小时的操作后非常热,我不得不关闭它几个小时。

欢迎任何建议

共有1个答案

楚鸿波
2023-03-14

这个问题已经解决了,因为我发现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

  • 我试图用阻塞队列实现一些消费者-生产者问题。为了达到某种目的,我决定编写文件搜索工具。 我认为搜索机制是递归工作的,每个新目录都将有新的线程池来提高搜索速度。 我的问题是,我不知道如何实现最终停止打印线程(消费者)的机制——当搜索线程完成工作时。 我试图用一些想法来做到这一点,比如毒丸,但它效果不佳(线程在打印任何结果之前停止)。任何想法我该怎么做? 下面是一些代码: 搜索机制: } 打印机: }