关于JAVA的SOCKET多线程问题
各位师兄好:
兄弟做好了一个网关。原理如下:网关程序需要去连接一堆的远程机子,并且是保持长连接,对每一个SOCKET进行相应的处理。远程机子的HOST和PORT都保存在一个ArrayList类型的集合中,我从中依次读取出每一个HOST和PORT,读出一个后,我先判断目前SOCKET连接组中是否有该SOCKET,如果没有则新建该SOCKET,同时启动一个线程来处理相应的事务。在这个线程中,当通讯出错(可能是SOCKET断掉了)出现异常时,将连接组中的该SOCKET删除。程序如下:
public class AmClient {
private ThreadGroup threadGroup; ///线程组
private Map socketGroup = new HashMap(); //SOCKET连接组
ArrayList ipArray;////HOST与PORT的集合
String host;
int port;
public AmClient() {
threadGroup = new ThreadGroup(AmClient.class.getName());
}
public static ArrayList readXml() {
........
//////这里给ipArray这个集合附值,写入N个HOST和PORT
}
public static void main(String[] args) {
AmClient amClient = new AmClient();
ipList = readXml();
while (true) {
try {
amClient.socketRequest(ipList);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void socketRequest(ArrayList ipArray) {
BufferedReader in;
PrintWriter out;
Socket socket;
for (Iterator it = ipArray.iterator(); it.hasNext(); ) {
Map ipMap = (Map) it.next(); ///一行是一个Map
////取出参数
host = (String) ipMap.get("host");
port = Integer.parseInt((String) ipMap.get("port"));
String key = host + Integer.toString(port);
try {
if (socketGroup.get(key) == null) {
/////当连接没有建立时或连接断开了,新建SOCKET后再启动线程
System.out.println("controller start...");
socket = new Socket(host, port);
AmConnection k = new AmConnection(socket, ipMap);
socketGroup.put(key, socket); ///放入连接组中
}
} catch (Exception e) {
////若出现断路情况,将socket从连接组中删除
if (socketGroup.get(key) != null) {
///若连接组中已有该连接
socketGroup.remove(key); ////从连接组中删除
}
System.out.println("socket断路了:" + e);
}
}
}
//处理每个SOCKET的线程
public class AmConnection extends Thread {
Socket client; //客户通信套接字
Map ipMap;
private String amHost,key;
private int amPort;
public AmConnection(Socket client, Map ipMap) {
super(threadGroup,
client.getLocalAddress() + Integer.toString(client.getPort()));
this.client = client;
this.ipMap = ipMap;
amHost = (String) ipMap.get("host");
amPort = Integer.parseInt((String) ipMap.get("port"));
key = amHost + Integer.toString(amPort);
start();
}
public void run() {
try {
........
////作相应的处理
} catch (Exception e) {
////若出现断路情况,将socket从连接组中删除
if (socketGroup.get(key) != null) {
///若连接组中已有该连接
socketGroup.remove(key); ////从连接组中删除
}
System.out.println("socket断路了:" + e);
interrupt(); //中断该线程
}
}
}
}
现在的问题是:我程序运行后,功能倒是可以实现,可是CPU的占用率达到了100%。后来我在main方法中加了一句
try {
amClient.socketRequest(ipList);
Thread.sleep(5000); //就加了这句
}
CPU就正常了。这是为什么呢?望知情者详细解释,谢谢。