关于HashMap多线程下,不同键覆盖的问题 情况是这样的,有一个服务器类,有个HashMap类型的属性,作为链接池。当一个链接过来的时候,就把该链接和输入输出流包装成一个对象,放入到HashMap里,当第二个链接过来的时候,又把该链接和输入输出流包装成一个对象放入到里面。但是后来的链接对象总是会覆盖掉前面的对象,不管链接多少个,最后连接池里,只有一个链接,也就是最后一个链接。不知道是什么原因,有高手解答下吗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class ServiceThread extends Thread { public Socket socket; private ObjectOutputStream objectout; private ObjectInputStream objectin; private Hashtable<String, Connection>map ; private Connection connectioninf; private Message message; // 重写构造函数 public ServiceThread(Socket s ,Hashtable m) throws IOException, ClassNotFoundException { socket = s; System.out.println("连接上"); System.out.println("线程池"+m); map = m; objectout = new ObjectOutputStream(socket.getOutputStream()); objectin = new ObjectInputStream(socket.getInputStream()); connectioninf = new Connection(); connectioninf.setObjectin(objectin); connectioninf.setObjectout(objectout); connectioninf.setSocket(socket); String d = (String)objectin.readObject(); System.out.println(d); map.put("d", connectioninf); System.out.println(map); System.out.println("放入连接池"); System.out.println(map); start(); } // 重写run方法 处理客户端的服务请求 public void run() { while(true){ try { message = (Message)objectin.readObject(); String p = message.getReceiver(); System.out.println(p); Connection c =map.get(p); System.out.println(map); System.out.println(c); c.getObjectout().writeObject(message.getMesaage()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }} 该链接和输入输出流包装成一个对象这个map的key是什么?若是string,看看是代码,若是对象,看看其hashcode和equals方法是否正确其实多线程的话,或许用concurrenthashmap更合适 map 的key 是 客户端传过来的用户名,也就是String 多线程 最好是 用Hashtable .... connectioninf.setSocket(socket);String d = (String)objectin.readObject();System.out.println(d);//map.put("d", connectioninf);map.put(d, connectioninf);楼主你再试试 哈哈,太不仔细了。我整了半天,还查了半天的资料,竟然是自己写错了。谢谢 fable0115 初次发贴,定义一个类,输入整数 赋值给数组,求和 socket编程问题,请高手帮忙 //程序中这种用法第一次看到,请问各位碰到过吗? *JAVA程序员高级群* java提取HTML正文的正则表达式?? JAVA连接SQL Server的问题,小妹拜求高手指教,小妹先谢过了!!!!!!!! Applet 必须每次都从服务器上下载吗,它能象ActiveX 控件下载到本地吗 黑盒问题 急急急急急急!明天就交作业了! throws 和throw在抛出异常时有什么区别????? 各位大侠,麻烦看这个程序的结果为什么这样 泛型<T extends Car>和泛型<? extends Car>
public Socket socket;
private ObjectOutputStream objectout;
private ObjectInputStream objectin;
private Hashtable<String, Connection>map ;
private Connection connectioninf;
private Message message;
// 重写构造函数
public ServiceThread(Socket s ,Hashtable m) throws IOException, ClassNotFoundException {
socket = s;
System.out.println("连接上");
System.out.println("线程池"+m);
map = m;
objectout = new ObjectOutputStream(socket.getOutputStream());
objectin = new ObjectInputStream(socket.getInputStream());
connectioninf = new Connection();
connectioninf.setObjectin(objectin);
connectioninf.setObjectout(objectout);
connectioninf.setSocket(socket);
String d = (String)objectin.readObject();
System.out.println(d);
map.put("d", connectioninf);
System.out.println(map);
System.out.println("放入连接池");
System.out.println(map);
start();
} // 重写run方法 处理客户端的服务请求 public void run() {
while(true){
try {
message = (Message)objectin.readObject();
String p = message.getReceiver();
System.out.println(p);
Connection c =map.get(p);
System.out.println(map);
System.out.println(c);
c.getObjectout().writeObject(message.getMesaage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }}
connectioninf.setSocket(socket);
String d = (String)objectin.readObject();
System.out.println(d);//map.put("d", connectioninf);
map.put(d, connectioninf);
楼主你再试试