无法向ArrayList添加对象

问题描述

我用一个单例的管理类管理很多个list,现在我的其他的模块调用这个管理类并向它的一个ArrayList里面添加一个对象,但是这个ArrayList一直为null,另外说明这个ArrayList是放在一个线程里面反复循环的,因为我要通过里面的对象用socket向各个地方发包。另求socket接收和分发包的示例(自己作为一个流的管理者,下面的分支都向自己拉流,管理者根据请求的地址和端口发包)代码如下:public class InviteStreamWorker extends Thread {public static List<StreamInviter> inviters = new ArrayList<StreamInviter>();public void addInviter(StreamInviter inviter) {if (!checkExistInviter(inviter)) {inviters.add(inviter);}}@Overridepublic void run() {HsSipUtil.info("method", "InviteStreamWorker.run()");if (isStream) {byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf, buf.length);DatagramPacket packetToSend;try {socket.receive(packet);packetToSend = new DatagramPacket(packet.getData(),packet.getData().length);if (inviters.size() > 0) {for (StreamInviter inviter : inviters) {HsSipUtil.info("address", inviter.getAddress());HsSipUtil.info("port", inviter.getPort());packetToSend.setAddress(InetAddress.getByName(inviter.getAddress()));packetToSend.setPort(Integer.valueOf(inviter.getPort()));socket.send(packetToSend);}} else {System.out.println("no inviter in list now");}} catch (IOException e) {e.printStackTrace();}}}} 问题补充:kidding87 写道

解决方案

socket.send(packetToSend); 只有这里发送成功了,下个发送才会开始,也算是阻塞式发送这里我觉得可以new Runnable(){}.start();推荐一篇帖子你看看http://www.iteye.com/topic/834447使用nio来处理
解决方案二:
想法没问题,实现的有些问题。首先你触发循环list的条件应该是socket接收到包就触发,这个可以这么做:写个static的ArrayBlockingQueue阻塞队列 ,socket接收到了就放到这个队列里。run这个函数死循环做这个事情:while(isRuning){获取队列里的包,没有的话队列会阻塞等待,见ArrayBlockingQueue API take()获取到包的话,遍历arraylist,发送这个包}另外既然你这个inviters 是多线程操作的,就用CopyOnWriteArrayList,即arraylist的多线程版本。其实就是个生产者消费者模式,只不过生产者一个socket,消费者是多个socket。
解决方案三:
对啊,你这个线程直接就跑玩了,什么都没做,就要让它一直跑着还有你这个应该算作一个操作栈,建议自己继承个linkedlist,里面定义个private volatile boolean hasNewCome; 在add的时候,去改变它的值,或者直接记录新加了什么东西在run的时候一直去判断有没有新加的数据就可以了当然我也就提供了一个思路
解决方案四:
用while(inviters.size()!=0){//todo//interval为循环的时间间隔sleep(interval)}当然你要保证你的inviters插入和拿到数据都是正常的
解决方案五:
if (isStream) 这个不知道你怎么判断的而且你这个run很容易就run完了。。。

时间: 2024-09-15 09:38:18

无法向ArrayList添加对象的相关文章

java程序中往list中添加对象

问题描述 java程序中往list中添加对象 我有一个类holiday,属性有name和date.先是声明一个list,List list =new ArrayList();然后就holiday hol =new holiday(name,date);最后使用add方法,list.add(hol);这样做是否正确. 可是当我遍历list时,输出的并不是原来定义的name和date,而是,holiday@89ae9e,请问这样对吗?如果我这样在往数据库里存数据是否可以...... 解决方案 楼上正

ios-在数组中添加对象出现错误╯□╰

问题描述 在数组中添加对象出现错误╯□╰ 在往数组中添加对象时报错:-[__NSArrayI addObjectsFromArray:]: unrecognized selector sent to instance 0xa0c5f70 代码: id max; NSMutableArray * MovePointsArray=[[NSMutableArray alloc]init]; max=[pointsArray objectAtIndex:0]; for(int i=0;i<[points

在java当中如何理解添加对象到集合

问题描述 在java当中如何理解添加对象到集合 集合是指类的集合还是对象的集合啊,能否举个简单的例子,谢谢解答 解决方案 对象的集合啊. 我们有一个类Dog(狗狗),我们可以这样 AttayList<Dog> list = new AttayList<Dog>(); list.add(new Dog(""史努比"" 1)); list.add(new Dog(""金毛"" 2)); 此时new Dog(

ios-给数组添加对象时报EXC_BAD_ACCESS

问题描述 给数组添加对象时报EXC_BAD_ACCESS 给数组添加对象时报EXC_BAD_ACCESS int indiceCorrente=0; int differenza=delegate.reader.feedItems.count; while(variable!=0){ switch(variable){ case 1: ---- case 2: ---- default: { NSMutableIndexSet *add=[[[NSMutableIndexSet alloc]in

《Unreal Engine 4蓝图可视化编程》一1.2 为关卡添加对象

1.2 为关卡添加对象 现在我们希望添加自定义对象到关卡中.在关卡编辑器的中心面板是3D视口,视口为我们呈现游戏的3D内容.这时,熟悉在3D视口中的移动很重要.可以通过使用鼠标按键和拖动鼠标向周围移动控制摄像机来改变视角.在视口中按住鼠标左键并拖动光标将可以操控摄像机向前后左右移动,按住鼠标右键拖动光标将会旋转相机的视角.最后,按住鼠标中键并拖动光标将可以调整相机的位置(上下左右).[2] UE4中最简单的对象称为actor.它可以被拖曳到游戏世界中.actor是最基本的对象,除了能够旋转.移动

《ActionScript 3.0基础教程》——第2章 往舞台动态地添加对象2.1 创建库资源,并为它命名

第2章 往舞台动态地添加对象 现在你已经学会了如何操作舞台上已有的对象,接下来你将学习如何使用ActionScript动态地往舞台添加存放在库中的对象. 与前一章的区别是,你将要操作的对象还没有被放到舞台上.当程序编译成SWF以后,你将使用ActionScript动态地往舞台中添加来自库中的对象. 2.1 创建库资源,并为它命名 你应该还记得,如果要访问舞台上对象的属性,你需要为对象取一个名字,这样ActionScript才能引用它.当你从库中往舞台添加对象时,同样需要为对象取一个唯一的名字,同

js 声明数组和向数组中添加对象变量的简单实例_javascript技巧

数组有四种定义的方式 使用构造函数: var a = new Array(); var b = new Array(10); var c = new Array("first", "second", "third"); 或者数组直接量: var d = ["first", "second", "third"]; 扩展: function ObjStory(id,biaoti,author

arrayList添加类

问题描述 我想在arraylist中添加一个类,用add()方法,各位大神看看哪有问题.ArrayList<KF>al=null;Connectionconn=null;Statementstmt=null;ResultSetrs=null;Stringsql="select*fromkf";MysqlDbmdb=newMysqlDb();conn=mdb.getConn();try{stmt=conn.createStatement();rs=stmt.executeQu

Oracle重建或添加对象

如前例中所示,指定对象跳过应用虽然被取消,但是有可能在此期间由于Primary数据库做过数据 修改,两端此时已经不同步,如果Standby端继续应用极有可能导致应用错误的数据. 对于这类情况,Oracle数据库也早有预见,DBMS_LOGSTDBY包中还有一个过程叫INSTANTIATE_TABLE ,专门用来同步一下跳过的对象,以保持与Primary数据库的一致. DBMS_LOGSTDBY.INSTANTIATE_TABLE的调用语法如下: 1. DBMS_LOGSTDBY.INSTANTI