`
samttsch
  • 浏览: 63808 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

多线程发送消息之流控

阅读更多
近期接触到流量,由于旧的版本流控不准确,所以相对其改进一下

整体方案:使用jdk1.5的信号量机制,没法送一条消息,信号量加1,当信号量达到上限时,阻塞,等待定时线程来清理(每100毫秒尝试清理一次)

1.首先想到使用Semaphore来实现,不过测试时发现,由于semaphore不能够重入,这导致,在1秒钟内一个线程发送了一条之后,就会阻塞,这样一秒钟每个线程只能发送一条消息。

2.采用ArrayBlockingQueue来实现,每发送一条调用一次put方法(put时如果发现超过1秒钟,则立即清0),定时线程每100毫秒尝试清理一次,但是发现用ArrayBlockingQueue似乎不够轻便,因为其内部维护了一个对象数组。

3.自定义个可重入的信号量类,参照ArrayBlockingQueue来实现,去掉其中的对象数组,值保留put和clear方法,(put方法改名为acquire)。

public class ReentrantSemaphore
{
    private int size;
    private final ReentrantLock lock;
    private final Condition notEmpty;
    private final Condition notFull;
    private int count;
    
    public ReentrantSemaphore(int capacity) {
        size = capacity;
        lock = new ReentrantLock();
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }

    
    public void clear() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            count = 0;
            notFull.signalAll();
        } finally {
            lock.unlock();
        }
    }
    
    public void acquire(int x) throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            try {
                while (count == size)
                    notFull.await();
            } catch (InterruptedException ie) {
                notFull.signal(); // propagate to non-interrupted thread
                throw ie;
            }
            count+=x;
        } finally {
            lock.unlock();
        }
    }
}


经过测试,这种方式可以比较好的实现,如果其他人有更好的实现,希望能一起讨论。

完整代码在附件中:
分享到:
评论
3 楼 奥义之舞 2011-06-27  
samttsch 写道
直接计数不准确,每次到达上限,你sleep多长时间算好呢?
假设只有一个线程,sleep时间较长的话,会使得下一秒发送次数变少。

如果sleep时间较短,多个线程时(数目较多),高并发的情况下性能会比较差, 而使用基于AQS的锁,性能不会降低很多,这也是我使用并发类的主要原因。


牛逼人必有牛逼之处。。。
2 楼 samttsch 2011-06-25  
直接计数不准确,每次到达上限,你sleep多长时间算好呢?
假设只有一个线程,sleep时间较长的话,会使得下一秒发送次数变少。

如果sleep时间较短,多个线程时(数目较多),高并发的情况下性能会比较差, 而使用基于AQS的锁,性能不会降低很多,这也是我使用并发类的主要原因。

1 楼 rocketball 2011-06-24  
直接一个计数器不就搞定的事情呀

相关推荐

    ros 单线多线流控脚本

    多线程流控脚本则更复杂,它允许多个线程并行处理数据,提高系统效率。ROS提供了Nodelets和Dynamic Reconfiguration等工具来支持多线程和动态调整配置,从而实现更灵活的流控策略。Nodelets可以在多个线程中运行,...

    多线程实现无连接的Raw Socket通信.rar

    在本项目中,多线程用于同时处理多个Raw Socket通信任务,比如接收和发送数据可能由不同的线程负责。在Windows上,可以使用`CreateThread()`函数创建新线程,或者使用`std::thread`库(如果项目使用C++11及以上版本...

    计算机网络多线程通信简例

    在计算机科学领域,尤其是软件开发中,多线程通信是一个重要的概念,特别是在处理并发任务和优化性能时。本文将深入探讨计算机网络中的多线程通信,以Java编程语言为例,结合"MT_WebServer"这一文件,来阐述如何实现...

    两个串口多线程通信

    在IT行业中,多线程通信是一项关键技能,尤其是在需要处理多个并发任务或高效利用系统资源的场景下。本文将深入探讨“两个串口多线程通信”这一主题,结合标签“22”,我们可以理解为涉及两个串行端口在多线程环境下...

    android串口

    本文将深入探讨如何在Android系统上实现串口连接通信,并重点解析采用队列排队发送数据以及多线程处理发送与接收的过程。 一、Android串口基础 串口通信,又称为串行通信,是一种通过串行数据传输接口进行设备间...

    电子-stm32f407zgt6串口1发送数组.rar

    8. **多线程应用**:在操作系统环境下,可能需要考虑多线程并发访问串口的问题。确保使用互斥锁或信号量等机制保护串口资源,避免数据冲突。 9. **实时性**:在对实时性要求较高的应用中,应考虑串口通信的延迟,...

    mfc串口通信的接收与发送详情介绍包含完整代码.docx

    在实际应用中,你可能需要根据设备的需求进行更复杂的配置,比如设置流控、添加超时机制、处理多线程同步等问题。此外,还需要注意串口的打开、关闭以及错误处理,以确保程序的稳定性和可靠性。

    Qt编程下的串口小助手1.0版

    这个"Qt编程下的串口小助手1.0版"是一个实用工具,允许用户发送ASCII和16进制数据,并且具备多线程功能,以提高性能和响应性。 首先,让我们了解一下Qt。Qt是一个跨平台的应用程序开发框架,由C++编写,广泛用于...

    实现串口助手的功能,发送接收数据,可以以16进制显示和发送.zip

    在IT领域,串口通信是一种常见且重要的数据传输方式,尤其...总的来说,实现串口助手功能是一项涉及到硬件通信、多线程编程、GUI设计等多个IT技术领域的综合任务,对于学习和理解计算机系统与硬件的交互具有重要价值。

    C#多串口通信数据接收处理

    注意,由于串口数据的异步性质,事件可能在多线程环境下被调用,因此需要确保线程安全。 ```csharp private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp =...

    实验报告1

    总之,这个实验展示了如何在UDP基础上构建一个具有可靠性和流控特性的文件传输系统,模拟了TCP的部分功能,同时也允许多用户并发上传和下载,这对于理解网络协议的实现以及UDP和TCP的区别非常有帮助。

    UART.rar_uart pc_uart.exe_串口通信 C

    描述中提到的是一个基于多线程的串口通信程序,这意味着在PC端,该程序可能使用了多个线程来分别处理发送和接收数据,以提高效率和响应速度。 在串口通信过程中,PC作为主机,通过UART接口向下位机(通常是微控制器...

    简单网络会议系统

    综上所述,简单网络会议系统通过C#的Socket实现UDP组播通信,利用多线程技术提高并发处理能力,从而构建了一个高效、实时的网络交流平台。源代码的提供使得开发者能够更深入地理解系统的工作原理,并根据实际需求...

    qt 串口调试助手框架源码

    6. **线程安全**:为了防止在多线程环境下出现数据竞争,串口读写操作可能需要在单独的线程中进行。Qt提供了`QThread`类来实现线程,通过继承并重写`run()`函数,以及使用信号槽机制与主线程通信。 7. **错误处理**...

    tcp.rar_TCP 2008

    3. **多线程**:为了同时处理多个客户端连接,服务端通常需要使用多线程或多进程技术。每个连接可以由一个单独的线程处理,以便同时处理多个并发请求。 4. **事件驱动编程**:使用I/O完成端口(IOCP)或者异步套接字...

    简单的Udp聊天程序

    5. 多线程处理:由于聊天程序可能需要同时处理多个客户端的请求,开发者可能会采用多线程技术,每个连接对应一个线程,以实现并行处理,提高系统的响应速度。 6. 数据包组装与解析:UDP是无连接的,数据包的顺序和...

    linux c++ 简单串口通信

    在实际项目中,为了实现并发的发送和接收,或者同时处理多个串口,可以考虑使用多线程。每个线程负责一个特定的任务,如一个线程负责读取数据,另一个线程负责发送数据。 9. **文件夹结构**: 压缩包仅包含`src`...

    串口调试小助手1.3

    6. **多线程处理**:对于需要同时处理多个串口任务的情况,该软件可能支持多线程操作,让用户能同时监测和调试多个串口设备。 7. **日志记录**:为了方便后续分析,串口调试小助手通常会提供日志记录功能,保存所有...

    基于MFC下的基本通信串口

    但通过扩展和优化,我们可以实现更复杂的功能,如多线程串口读写、流控、异常处理等。 综上所述,基于MFC的基本通信串口涉及了串口通信的基础知识,包括串口的打开、配置、读写以及关闭。通过学习和实践,开发者...

Global site tag (gtag.js) - Google Analytics