当Server端收到一个Client的连接时,新创建一个Thread线程来处理该请求(输入输出)。
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket=new ServerSocket(5555);
Socket socket=null;
while (true){
socket=serverSocket.accept();
System.out.println("已经接收到客户端连接");
System.out.println(socket);
new Handle(socket).start();
}
}
}
class Handle extends Thread{
private Socket socket=null;
public Handle(Socket socket){
this.socket=socket;
}
public void run(){
PrintWriter out= null;
BufferedReader in=null;
try {
out = new PrintWriter(socket.getOutputStream(),true);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message=null;
while((message=in.readLine())!=null){
System.out.println("收到:"+message);
out.println(message.toUpperCase());
out.flush();
}
//关闭连接
in.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Client {
public static void main(String[] args) throws IOException {
Logger logger= org.apache.log4j.Logger.getLogger(echo.singleThread.Client.class);
Socket socket=new Socket("localhost",5555);
System.out.println(socket);
PrintWriter out=new PrintWriter(socket.getOutputStream(),true);
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader stdIn=new BufferedReader(new InputStreamReader(System.in));
String inMessage=null;
while((inMessage=stdIn.readLine())!=null){
out.println(inMessage);
System.out.println("Server return:"+in.readLine());
// in.reset();
out.flush();
}
in.close();
out.close();
stdIn.close();
socket.close();
}
}
java进程可以创建线程的数量由多个方面决定的:
- JVM的堆内存的大小
- Thread的stack大小
- 系统底层允许创建线程的数量
系统限制:
/proc/sys/kernel/pid_max, (32768)
max_user_process(ulimit -u),
/proc/sys/vm/max_map_count (65530)
所以,在默认情况下只能创建3万多个线程。