日期:2014-05-20  浏览次数:20582 次

帮我分析下这段多线程的服务端监听代码
这段代码是模仿一个标准的代码写的,这是一个服务端的监听客户端发消息的程序,但我不理解的是这里的循环是写在多线程的run方法里,这就等于一直是在同一个线程里运行了吧,能起到多线程的作用吗?而且我把多线程的代码删除后还是可以正常运行,为什么?这样写的目的是什么?

try {
server = new ServerSocket(8889);

new Thread(new Runnable() {

@Override
public void run() {
while(true) {
try {
Socket serverSocket = server.accept();
ObjectInputStream input = new ObjectInputStream(serverSocket.getInputStream());
Message message = new Message();
message = (Message)input.readObject(); .............................................

------解决方案--------------------
try {
server = new ServerSocket(8889);
//开启一个8889的端口
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Socket serverSocket = server.accept();
//等待接收客户端连接ObjectInputStream input = new ObjectInputStream(serverSocket.getInputStream());
//接收客户端发送的信息Message message = new Message();
message = (Message)input.readObject(); 
...................................

你这个server是一个单线程,while循环里面顺序执行,直到一个单循环结束才会到下一个单循环,也就是说,如果同时有多个client向这个server发起请求,必须要等到前面一个的client的请求处理完毕
如果要想这个server是多线程的,那么要在每次while循环里面new一个thread,server端接收的信息处理交给这个thread去处理

public void run() {
while(true) {
try {
Socket serverSocket = server.accept();
Runnable r = new ThreadHander(serverSocket);
Thread t = new Thread(r);
t.start();
}
........
ThreadHander类
Java code

public class ThreadHander imlements Runnable{
Socket serverSocket;
public ThreadHander(Socket serverSocket){
this.serverSocket=serverSocket;
}
public void run(){
ObjectInputStream input = new ObjectInputStream(serverSocket.getInputStream());
Message message = new Message();
message = (Message)input.readObject(); 
//.........
}
}