问题描述
我用一个单例的管理类管理很多个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完了。。。