我用一个单例的管理类管理很多个list,现在我的其他的模块调用这个管理类并向它的一个ArrayList里面添加一个对象,但是这个ArrayList一直为null,另外说明这个ArrayList是放在一个线程里面反复循环的,因为我要通过里面的对象用socket向各个地方发包。另求socket接收和分发包的示例(自己作为一个流的管理者,下面的分支都向自己拉流,管理者根据请求的地址和端口发包)
代码如下:
[code="java"]public class InviteStreamWorker extends Thread {
public static List inviters = new ArrayList();
public void addInviter(StreamInviter inviter) {
if (!checkExistInviter(inviter)) {
inviters.add(inviter);
}
}
@Override
public 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();
}
}
}
}[/code]
socket.send(packetToSend);
只有这里发送成功了,下个发送才会开始,也算是阻塞式发送这里我觉得可以
new Runnable(){}.start();
推荐一篇帖子你看看
http://www.iteye.com/topic/834447
使用nio来处理
if (isStream)
这个不知道你怎么判断的
而且你这个run很容易就run完了。。。
用while(inviters.size()!=0){
//todo
//interval为循环的时间间隔
sleep(interval)
}
当然你要保证你的inviters插入和拿到数据都是正常的
对啊,你这个线程直接就跑玩了,什么都没做,就要让它一直跑着
还有你这个应该算作一个操作栈,建议自己继承个linkedlist,里面定义个
private volatile boolean hasNewCome;
在add的时候,去改变它的值,或者直接记录新加了什么东西
在run的时候一直去判断有没有新加的数据就可以了
当然我也就提供了一个思路
想法没问题,实现的有些问题。
首先你触发循环list的条件应该是socket接收到包就触发,这个可以这么做:
写个static的ArrayBlockingQueue阻塞队列 ,socket接收到了就放到这个队列里。
run这个函数死循环做这个事情:
while(isRuning){
获取队列里的包,没有的话队列会阻塞等待,见ArrayBlockingQueue API take()
获取到包的话,遍历arraylist,发送这个包
}
另外既然你这个inviters 是多线程操作的,就用CopyOnWriteArrayList,即arraylist的多线程版本。
其实就是个生产者消费者模式,只不过生产者一个socket,消费者是多个socket。