Java BIO(同步阻塞 I/O)
一个客户端请求,必选要使用一个线程来执行。如果是单线程执行,就会造成其请求进行等待。
BIO是如何工作的:
一个连接一个线程处理
代码演示
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
try {
new Thread() {
@Override
public void run() {
// 开始执行 业务处理
}
}.start();
} catch (Exception e) {
e.printStackTrace();
if (socket != null) {
socket.close();
}
}
}
这种BIO模式会有一个很大的缺点,服务器每次收到一个请求,就创建一个线程,JVM就会分配一个内存,如果并发过多,会频繁创建线程,对服务器造成很大的开销,GC回收不及时,就会造成内存泄漏或内存溢出
BIO 线程池的实现
代码演示
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(100, 160,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(128));
ServerSocket serverSocket = new ServerSocket(8080);
while (true) {
Socket socket = serverSocket.accept();
try {
poolExecutor.execute(new Runnable() {
@Override
public void run() {
// 执行业务请求
}
});
} catch (Exception e) {
e.printStackTrace();
if (socket != null) {
socket.close();
}
}
}
线程池实现可以避免频繁创建线程而导致内存泄漏或内存溢出的问题。但也有缺点:因为线程池设定的最大线程数,并发过多时,线程池的线程如果没有空闲的,就会进行等待,直到有空闲线程才会执行。很明显不能满足高并发。