专修虚拟机 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条)

报告相同问题?

悬赏问题

  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥15 绘制多分类任务的roc曲线时只画出了一类的roc,其它的auc显示为nan
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败