近期接触到流量,由于旧的版本流控不准确,所以相对其改进一下
整体方案:使用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();
}
}
}
经过测试,这种方式可以比较好的实现,如果其他人有更好的实现,希望能一起讨论。
完整代码在附件中:
分享到:
相关推荐
使用Netty4实现多线程的消息分发,这是一个基于netty4做的一个异步通信模型。
MFC多线程内的消息例子
多线程使用消息队列
很不错的C#多线程消息处理例子,UI界面,给出了后台线程向界面传递信息以及UI线程解析信息的完整过程。值得一看!
C++多线程,消息队列用法,为了凑够20个字,拼了。
使用C#开发的工资邮件发送程序,使用多线程快速发送。
java 多线程 数据流 tcp thread i/o
通过多线程的方式实现了UDP收发数据 可以快速学习UDP通讯原理应进行实际应用
多线程及消息发送传递结构体参数
简单易用的多线程发邮件。其中用的callble,里面的发送的邮件是固定的,利用的newFixedThreadPool。你可以自己调整成其他的线程池,原理一样。
经过探索,我发现可以实现一个主线程给多个线程发送消息,主线程接收每个线程的内容进行处理 下面是我改造的例子:
易语言简单的多线程消息队列。@Patek。
串口通信,多线程接收数据,并可以发送数据
vc通过多线程发送消息来控制窗口控件,一般情况多线程无法直接控制窗口控件。
java用多线程实现消息的压入栈和从消息栈中取出消息,使用在一些如访问网络时某些线程往消息栈中压入消息,某些线程从栈中取出消息并访问网络获取资源等场景。
基于VC6.0的消息多线程,实现简单实用的多线程,很好用。
主要介绍了JAVA模拟多线程给多用户发送短信,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
使用多线程编写的收发消息Demo,参考时请对多线程和套接字做基本的了解
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
.net 版本 发送微信模板模板消息给关注公众号的用户,支持单个发送,同时也支持批量发送,经过测试完全可以使用。