专修虚拟机 2015-11-21 13:13 采纳率: 0%
浏览 2142
已采纳

java创建一个输出流赋值为null的作用

public class Server {
//服务端socket
private ServerSocket serverSocket;
//所有客户输出流
private List allOut;
//线程池
private ExecutorService threadPool;
/**
* 构造方法,用于初始化
*
/
public Server() {
try{
serverSocket=new ServerSocket(8088);
allOut=new ArrayList();
threadPool=Executors.newFixedThreadPool(40);
}catch(Exception e){
e.printStackTrace();
}

}
/
*
* 服务端开启方法
*/
public void start(){

    while(true){
        try{
        System.out.println("等待服务端连接!");
        //监听客户端连接
        Socket socket=serverSocket.accept();
        System.out.println("服务端已经连接");

        //启动一个线程来完成针对客户端的操作
        ClientHandler handler=new ClientHandler(socket);
        threadPool.execute(handler);    



    }catch(Exception e){
        e.printStackTrace();
    }

    }

}

/**
 * 将输出流存入共享集合,与下面两个方法互斥 保证同步安全
 * @param out
 */
public synchronized void addOut(PrintWriter out){
    allOut.add(out);
}
/**
 * 将输出流从共享集合删除
 * @param out
 */
public synchronized void removeOut(PrintWriter out){
     allOut.remove(out);
}
/**
 * 将信息转发给所有客户端
 */
public synchronized void sendMessage(String message){
    for(PrintWriter o:allOut){
        o.println(message);
    }
}

public static void main(String[] args) {
    Server server=new Server();
    server.start();
}
/**
 * 线程体,用于处理不同客户端的交互
 * @author Long
 * 
 */

private class ClientHandler implements Runnable{
private Socket socket;
//该线程用于处理客户端
public ClientHandler(Socket socket){
this.socket=socket;
}
@Override
public void run(){
PrintWriter writer=null;
try{
//获取客户端输出流存入共享集合,广播消息
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"utf-8");
writer=new PrintWriter(osw,true);

        /**
         * 将用户发的信息存入共享集合,需要同步
         */
        addOut(writer);

        InputStream is=socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(is, "utf-8");
        BufferedReader reader=new BufferedReader(isr);

        Scanner sc=new Scanner(System.in);
        String message=null;
        while((message=reader.readLine())!=null){
            sendMessage(message);
        }
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        /**
         * 当客户端断线,要将输出流从共享集合中移除
         * 需要同步
         */
        removeOut(writer);
        if(socket!=null){
            try{
                socket.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }

    }
}

}

}
1. 在线程体中(文中黑线)为什么要先PrintWriter writer=null而不是在try中直接赋值

  • 写回答

3条回答 默认 最新

  • 普通网友 2015-11-21 13:18
    关注

    PrintWriter writer=null在try中直接赋值那么它的生命周期就只是在try语句块中

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 ansys electronics 2021 R1安装报错,错误代码2,如图
  • ¥30 搭建面包板由NE555N和SN74LS90N组成的计时电路时出了问题
  • ¥15 无源定位系统的时差估计误差标准差
  • ¥15 请问这个代码哪里有问题啊
  • ¥20 python--version在命令端输入结果Python is not defined怎么办?还有pip不是exe格式是不是没安装成功?
  • ¥15 通过GaussianView进行结构微调消除虚频
  • ¥15 调用transformers库
  • ¥15 由于导出的数据名字中带有/,导致Matlab打不开,怎么办?
  • ¥15 新硬盘安装的程序总是崩溃,提示遇到错误
  • ¥15 openpcdet自制数据集评估bev精度和3d精度相同