为每一个消息开辟一个线程处理
此种设计模式存在巨大的缺陷。因为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();
}
}