Thread-Per-Message模式

为每一个消息开辟一个线程处理

此种设计模式存在巨大的缺陷。因为JVM开创线程数量是有限的。

此种方式可以用于系统资源初始化,或者系统关闭时资源回收。

如果线程数量较多,可以采用线程池实现。

如聊天程序实现:

public class ChatServer{

    //端口

    private final int port;

    //服务类

    private ThreadPool serverSocket;



    private ChatServer(int port){

        this.port = port;

    }

    

    public ChatServer(){

        this(13312);

    }

    //启动服务

    public void startServer()throws IOException{

        //一旦超过4个,则会被至于等待队列。

        this.threadPool = new BasicThreadPool(1,4,1,1000);

        this.serverSocket = new ServerSocket(port);

        this.serverSocket.setReuseAddress(true);

        this.listen();

    }

    //监听Socket请求

    private void listen() throws IOException{

        for(::){

            Socket socket = ServerSocket.accept();

            this.threadPool.execute(new ClientHandler(client)):

        }

    }

}



public class ClientHandler implements Runnable{

    //Socket对象

    private final Socket socket;

    //身份标识

    private final String clientIdentify;



    public ClientHandler(final Socket socket){

        this.socket =socket;

        this.clientIdentify = socket.getInetAddress().getHostAddress()+":"+socket.getPort();

    }



    public void run(){

        try{

            this.chat();

        }catch(IOException e){



        }

    }



    private void chat() throws IOException{

        //输入流

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

        //输出流

        PrintStream printStream = new PrintStream((this.socket.getOutputStream());



        String received;

    

        while((received = bufferedReader.readLine()) != null){

            //打印至控制台

            System.out.println("client: %s-message:%s\n",clientIdentify,received);

            if(received.equals("quit")){

                wirte2Client(printStream,"client will close");

                socket.close();

                break;

            }

            write2Client(printStream,"Server:"+received);

        }

    }



    //向客户端发送消息

    private void write2Client(PrintStream print,String message){

        print.println(message);

        print.flush();

    }



}
发布了115 篇原创文章 · 获赞 57 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_35211818/article/details/104186604