这段代码是模仿一个标准的代码写的,这是一个服务端的监听客户端发消息的程序,但我不理解的是这里的循环是写在多线程的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(); .............................................

解决方案 »

  1.   

    最好给我讲一下这段代码的原理,他的过程,最好结合cpu和内存讲,是每次进来这个循环系统就自动分配一个新的线程吗,还是怎样?
      

  2.   

    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类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(); 
    //.........
    }
    }
      

  3.   

    如果是这样的话,那外层的线程实例还要吗,比如第一个run(),如果有必要要为什么?public void run() {      //这个还有没有用?
    while(true) {
    try {
    Socket serverSocket = server.accept();
    Runnable r = new ThreadHander(serverSocket);
    Thread t = new Thread(r);
    t.start();
    }
    ........
    ThreadHander类
      

  4.   

    看你用什么线程启动这个server了
    如果是main线程启动就没必要了
    如果是别的线程来启动这个server
    那当然需要了