Java Thread.sleep()线程休眠时底层到底发生了什么?记录netty的ChannelHandlerContext写入操作的怪事一桩

熟悉Netty的朋友,ChannelHandlerContext 写入操作的怪事,求解惑。

类A中有一个sendData方法,用于通过ChannelHandlerContext发送数据到客户端

问题是:在类B中调用类A的sendData方法时,要在之前休眠100毫秒或以上才能成功发送数据到客户端。

注:产生此问题的环境是在多线程的环境下。

类A:

class A{

   public boolean sendData(int deviceId, String hexData){
     try {

//deviceChannel是一个hashMap,用于存放存活的ChannelHandlerContext
      if (deviceChannel.containsKey(Integer.valueOf(deviceId))) {
        ChannelHandlerContext ctx = (ChannelHandlerContext)deviceChannel.get(Integer.valueOf(deviceId)); //取出缓存的通道
         byte[] data = Command.Trans(deviceId, hexData); //转换成byte数据
        
        ByteBuf bufAck = ctx.alloc().buffer();
         bufAck.writeBytes(data);
         ctx.write(bufAck);
         ctx.flush();
         return true;
      }
     return false;
    } catch (Exception e) {}
     return false;
 }

}

 

类B:

class B{

      A a=new A();

   public void  trans(){

           int iotAddr=123456;

          String hexData="01020000162C"
          boolean isTransSuccess=a.sendData(iotAddr, hexData);

         //isTransSuccess 返回true,但是客户端没收到数据,证明并没有真正发送成功,怪事是,在此方法之前休眠100毫秒或以上,能发送成功,请看下面。

   }

}

//休眠后的版本

 class B{

      A a=new A();

 public void  trans(){

        try {
            Thread.sleep(100);   //在调用类A的sendData方法之前休眠100毫秒或者以上,客户端成功接收到数据
        } catch (InterruptedException e) {
            e.printStackTrace();
        }    

      int iotAddr=123456;

       String hexData="01020000162C"
        boolean isTransSuccess=a.sendData(iotAddr, hexData);  //经过休眠后,isTransSuccess同样返回true,客户端也成功收到  数据

   }

}

为什么需要休眠100毫秒才能发送成功?   

Thread.sleep()时;底层到底发生了什么?通过Java的API了解到, Thread.sleep()是不释放锁的,因此推断出与锁无关,但是Thread.sleep()会释放CPU资源。

难道这问题跟CPU有关?本人才疏学浅,求大神解惑!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值