作者:幸福天使之宝贝 | 来源:互联网 | 2023-07-03 13:23
1.NIO阻塞模型1.1代码publicstaticvoidmain(String[]args){intport8080;ServerSocketserverSocketnull;
1. NIO阻塞模型
1.1 代码
public static void main(String[] args) {
int port = 8080;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
while (true){
try {
Socket accept = serverSocket.accept();
new Thread(new Runnable() {
@Override
public void run() {
InputStream inputStream = null;
try {
inputStream = accept.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = new byte[1024];
try {
int len;
while ((len = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.2 缺点
1) accpet阻塞
2) read阻塞,这也是为什么只能每连接每线程
3) 大量请求会创建大量线程,导致程序崩溃
1.3 这里发现一个有意思的问题,理论上accpet和read应该是线程阻塞的,但是我通过jconsole查看后发现,线程是runnable状态,所以以后不能通过线程状态来判断线程是否真的runnable。
引用:
1. Java线程和操作系统线程的关系
2. 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
2. NIO伪异步模型
2.1 代码
唯一的区别是,将 new Thread(xxx).start();
换成了 Execute.execute(new TimerTask(socket));
2.2 区别
相比较第一种模型,唯一的好处在于线程池可以限制线程的数量,不会无限的创建线程从而使服务彻底瘫痪。但是大量的请求意味着无数的请求会在放在队列,这会导致服务对外不可用。
3. NIO