Java中队列的用法

1. 定义队列


public static Vector<ReceiveData> queueain = new Vector<ReceiveData>();



2. 入队操作


package cn.com.superv.emanager.dnsalarm;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cn.com.superv.emanager.base.bo.Config;
import cn.com.superv.emanager.manager.ConfigManager;

public class ReceiveFromGW extends Thread{

private static final Log log = LogFactory.getLog(ReceiveFromGW.class);
private static final int maxreceivelength = 10240;
private static int remoteport = 2000; //这个端口从AM_CONFIG读取
private static int maxreceive = 10000; // 能接收的最大消息数
private static DatagramSocket socket=null;
public static boolean bRun = true;
private DatagramPacket inputdp = new DatagramPacket(new byte[maxreceivelength], maxreceivelength);

private ConfigManager configManager;

public void setConfigManager(ConfigManager configManager) {
this.configManager = configManager;
}

public ReceiveFromGW() {
super();
}

public void startReceiveFromGW(){
Config config = configManager.getConfig("ALARM_PORT");
if(config != null){
remoteport = Integer.parseInt(config.getValue().trim());
}
config = configManager.getConifg("ALARM_MAX_RECEIVE");
if(config != null){
maxreceive = Integer.parseInt(config.getValue().trim());
}
getDatagramSocket();
if(socket!=null)
start();
log.info("ReceiveFromGW7750 Start Port["+remoteport+"]");
}

public static DatagramSocket getDatagramSocket()
{
try {
if(socket==null){
socket= new DatagramSocket(remoteport);//绑定端口号
socket.setSendBufferSize(socket.getSendBufferSize()*10);
socket.setReceiveBufferSize(socket.getReceiveBufferSize()*10);
}
}
catch (SocketException e) {
e.printStackTrace();
log.error(e,e.fillInStackTrace());
}
return socket;
}


public void run() {
while(bRun){
try{
if(ReceiveAlarm.bAdd){
if(log.isDebugEnabled())
log.debug("receive gw7750 message port["+remoteport+"]start.............!");
socket.receive(inputdp);

int numBytes = inputdp.getLength();
byte[] readbytes = new byte[numBytes];
System.arraycopy(inputdp.getData(), 0, readbytes, 0, numBytes);

ReceiveData receivedata = new ReceiveData(inputdp.getAddress().getHostAddress(),new String(readbytes));

ReceiveAlarm.addData(receivedata,maxreceive);
log.info("data from port["+remoteport+"] ip:"+receivedata.getIpstr() + " data:" + receivedata.getDatastr());
if(log.isDebugEnabled()){
log.debug("receive gw7750 message end.............!");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error(e,e.fillInStackTrace());
}
}
}
}



3. 操作队列


private final static int MAX_PACKET_LENGTH = 4096;
public static boolean bRun = true;
public static boolean bAdd = true; // 是否继续接收告警
public static Vector<ReceiveData> queueain = new Vector<ReceiveData>();
private DatagramSocket socket=null;
private DatagramPacket outputdp;
private DatagramPacket inputdp = new DatagramPacket(new byte[MAX_PACKET_LENGTH], MAX_PACKET_LENGTH);


/**
* 以队列的方式接收和发送告警
* @param receivedata 接收到的数据
*/
public void receiveAlarm(ReceiveData receivedata){
try {
updateAlarmData(receivedata.getIpstr(),receivedata.getDatastr());
} catch (Exception e) {
log.error(e,e.fillInStackTrace());
}
}


public void startReceiveAlarm(){
start();
log.info("ReceiveAlarm Start!");
}
public void run() {
while(bRun){
try{
synchronized (queueain) {
if(queueain.isEmpty()){
try {
log.info("wait ................................................");
bAdd = true;
queueain.wait(1000 * 300);
} catch (Exception e) {
e.printStackTrace();
log.error(e,e.fillInStackTrace());
}
}
}
while (!queueain.isEmpty()) {
try{
ReceiveData rd = (ReceiveData)queueain.firstElement();
queueain.removeElementAt(0);
log.info("send .......................................... size: "+queueain.size());
receiveAlarm(rd);
} catch (Exception e) {
e.printStackTrace();
log.error(e,e.fillInStackTrace());
}
}
} catch(Exception ex){
log.error(ex,ex.fillInStackTrace());
}
}
}


public static void addData(ReceiveData receivedata, int maxreceive){

synchronized(queueain){
if(queueain.size() > maxreceive){
bAdd = false;
}
if(queueain.size() == 0){
bAdd = true;
}
if(bAdd){
queueain.add(receivedata);
queueain.notifyAll();
}
}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值