熟悉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有关?本人才疏学浅,求大神解惑!