大家好,下面的代码中Cal.size()是1,for循环应该只执行一次,但是有时却执行了多次,System.out.println("H是:"+h);打印多次都是0,循环没有跳出,很奇怪,不明白是什么问题,以下是完整代码,三个for循环是同样的问题
//每五秒钟自动遍历一次数据库,将策略数据发送至指定集中控制器
Runnable send = new Runnable() {
@Override
public void run() {
Mysend:
//for无限循环
for(;;)
{
try{
//byte[] cllx={1,2,3};
Convertion con=new Convertion();
gettacticsdata data=new gettacticsdata();
//读取存储在Map中已登录用户ID
Map map = Mymap.getChannels();
Iterator<String> it = map.keySet().iterator();
while (it.hasNext())
{
String key = it.next();
SocketChannel obj = map.get(key);
//判断当前客户是否在线,如果在线就传数据,不在就删除存储在Map中的登录信息
if(obj.isActive()==true)
{
//查询需要下发的策略B数据
ArrayList Bal = new ArrayList();
Bal=data.GetBdata(key);
//判断是否有需要下发的策略
if(Bal.size()>0)
{
for(int i=0;i<Bal.size();i++)
{
System.out.println("I是:"+i);
tacticsBdata Bl=(tacticsBdata) Bal.get(i);
byte[] Bdata=con.GetBdata(Bl);
//SocketChannel obj = map.get(key);
if(Bdata.length==32)
{
ByteBuf Bsend =Unpooled.copiedBuffer(Bdata);
obj.writeAndFlush(Bsend);
}
}
}
//查询需要下发的策略C数据
ArrayList Cal = new ArrayList();
Cal=data.GetCdata(key);
//判断是否有需要下发的策略
if(Cal.size()>0)
{
for(int h=0;h<Cal.size();h++)
{
System.out.println("H是:"+h);
tacticsCdata Cl=(tacticsCdata) Cal.get(h);
byte[] Cdata=con.GetCdata(Cl);
//SocketChannel obj = map.get(key);
if(Cdata.length==18){
ByteBuf Csend =Unpooled.copiedBuffer(Cdata);
obj.writeAndFlush(Csend);
}
}
}
//查询需要下发的策略A数据
ArrayList Aal = new ArrayList();
Aal=data.GetAdata(key);
//判断是否有需要下发的策略
if(Aal.size()>0)
{
for(int j=0;j<Aal.size();j++)
{
System.out.println("J是:"+j);
tacticsAdata Al=(tacticsAdata) Aal.get(j);
byte[] Adata=con.GetAdata(Al);
if(Adata.length==14){
ByteBuf Asend =Unpooled.copiedBuffer(Adata);
obj.writeAndFlush(Asend);
}
}
}
}else
{
System.out.println("此ChannelID已掉线: " + obj);
map.remove(key);
obj.close();
}
}
}
catch(Exception e)
{
break Mysend;
}
try {
//线程休眠10秒钟后再次启动
Thread.sleep(10000);
} catch (InterruptedException e) {
//e.printStackTrace();
}
}
}
};
new Thread(send).start();
感觉是while循环的问题,你每次遍历while循环都会重新加载一次Cal=data.GetCdata(key),就会遍历一次for循环;
Cla是不是没有赋初始值?
把代码 再粘完整一些
感觉,这段代码的外层是不是还有一个for循环?
在个代码的前面把Cal.size()打印出来,看下结果是什么。
System.out.println("Cal.size()是:"+Cal.size());
for(int h=0;h<Cal.size();h++)
{
System.out.println("H是:"+h);
tacticsCdata Cl=(tacticsCdata) Cal.get(h);
byte[] Cdata=con.GetCdata(Cl);
//SocketChannel obj = map.get(key);
if(Cdata.length==18){
ByteBuf Csend =Unpooled.copiedBuffer(Cdata);
obj.writeAndFlush(Csend);
}
如果输出结果是同样行数的
System.out.println("Cal.size()是:"+1);
System.out.println("H是:"+0);
的话,可能是因为外层for循环。
可能是最外围的while条件造成的,条件为真,会多次调用里面for循环
如果你确认你的Cal.size()是1,那么就是外面的while造成的。你看一下map的大小, 里面应该有多条数据
谢谢大家提示,问题已解决,最外层的for(;;)去掉,把休眠线程移到 while (it.hasNext())循环里面就好了