sleep(long millis, int nanos)没有精确纳秒级别

做一个rabbitMq的生产者消费者任务,生产者负责从数据库查询数据,放入mq,消费者从mq取数据,对数据进行解析,提取想要的字段。由于生产者放数据的速度超级快,而消费速度很慢,很容易造成队列中数据堆积。

首先想到的是多个消费者进行消费,采用mq的交换机的direct模式,随机生成abcd四个routing_key放入交换机。在消费端,声明四个队列,分别绑定abcd四个routing_key,这样就会由四个队列对数据进行并行处理,堆积少了一些,但还是有不少堆积。生产的速度远远大于消费速度,单纯的靠增加消费者数量好像不行,于是考虑生产的速度可以慢些。

每放一个睡眠x毫秒,至于是几毫秒,要看消费者的消费速度,大致就是看消费者消费一个需要多少秒。

我的消费速度大致是一秒550个,那么消费一个大致是1000ms/550=1.8ms,需要精确到纳秒级别。查源码发现 sleep(long millis, int nanos)是个假的,压根儿没有做到纳秒级别,源码如下:

 

public static void sleep(long millis, int nanos)
throws InterruptedException {
    if (millis < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos >= 500000 || (nanos != 0 && millis == 0)) {
        millis++;
    }

    sleep(millis);
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值