+ -
当前位置:首页 → 问答吧 → 关于静态变量和多线程

关于静态变量和多线程

时间:2011-12-07

来源:互联网

我最近在写一个简单的局域网聊天的小程序。通信发面已经实现,不过现在遇到了一个问题:我现在想实现一个在线用户列表的功能。首先我在聊天的Server端定义了一个静态的集合变量 public static List<String> userList = new LinkedList<String>(); 然后又定于了两个静态的方法 public static boolean userAdd(String userName) {
return userList.add(userName);

}

public synchronized static boolean userDelete(String userName) {

return userList.remove(userName);

}
最后我在Client 把登陆成功的用户名加到这个静态的容器里,但是我发现不管我开几个Client容器里的大小都是1,我写了几句测试代码 System.out.println(ChatServer.userAdd(jTextField1.getText()));//输出是否添加成功
System.out.println(jTextField1.getText()); //输出添加的用户名
System.out.println(ChatServer.userList.size());//输出容器的大小
System.out.println(ChatServer.userList.hashCode());//输出这个容器的哈希码
我发现我开一个client添加一个用户 容器大小是1 我又开了一个client 又添加了一个用户但容器大小还是1 且两次打印出的哈希码不同。请问这是为什么? 按我的想法 打开第二个client登陆的时候容器大小不是应该相应的变成2吗?为什么还是1呢? 好像每次都是添加给新容器的一样,可以我明明定义的是静态容器啊,这对于整个类来说不都应该是公用的吗?最后我实在是想不出 就把定义的那另个静态方法都加了锁,但结果却没有任何变化。请高手指点,谢谢了!!!


我把它抽离出来写了两个小测试类public class test {

public static List<String> userList = new LinkedList<String>();

public static void add(String str){
userList.add(str);
}
}

public class test2 {


public static void main(String[] args) {
test.add("asdasd");
test.add("weqwe");

System.out.println(test.userList.size());
}

}

然后我多次运行test2 发现结果永远都是2!这是为什么?

作者: femgyue   发布时间: 2011-12-07

楼主的多次运行就是关闭了再重新运行了吗? 如果是的话就是肯定一直就是2了

作者: wuyingjielao2   发布时间: 2011-12-07

不是关闭,是开一个再开一个没有关闭之前的!

作者: femgyue   发布时间: 2011-12-07

不管关没关 都是重新开始一个新程序啊

作者: wuyingjielao2   发布时间: 2011-12-07

聊天室我也做过 关于那个在线用户 我是每次新客户端登录 都把用户信息,也就是list存在了服务器端里 这样新客户端登录的时候 服务器把最新的list发过去  

你第二次那个测试的例子不对  

对了 你客户端是用的线程吗?

作者: wuyingjielao2   发布时间: 2011-12-07

你用的是多线程还是多进程?多进程是不共享数据区的(copy 父进程)。
不是多进程的话你再描述的详细一点。

作者: denvilliyankai   发布时间: 2011-12-07

说错了 是服务器端要用线程
聊天室一定要用到多线程啊 Server是单线程 不能支持多个Client并发访问 而聊天室有很多 Client和Server 对话 说白了就是Server要为多个Client服务 所以Server要采用多线程

作者: wuyingjielao2   发布时间: 2011-12-07

每次运行都是重新初始化一次,怎么会增加呢

作者: huntor   发布时间: 2011-12-07

每次发生一次 C和S 的会话就要启动一个线程,Server是一个进程,里面可以建立多个线程,比如 第一个客户登录后 启动了一个线程,把客户信息存在了Server端,等下一个客户登录的时候,又启动了一个线程,但是这个线程可以得到上一个客户的信息。因为Server这个进程一直运行,里面的信息不会被重新初始化...

作者: wuyingjielao2   发布时间: 2011-12-07

重新运行,就重新初始化,

作者: wang7535067   发布时间: 2011-12-07

热门下载

更多