1.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。和多线程完全两个级别。
2.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。和多线程完全两个级别。
3.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。和多线程完全两个级别。
2.多线程只是能用来避免阻塞或者同步方法时的效率低问题
1.多线程和阻塞及非阻塞一点关系没有。并不是多线程就非阻塞了。
2.比如socket读取http request数据时,肯定是要多线程读取的,每个连接对应一个线程去读。因为传统的socket的accept(),send()这些方法是阻塞的,程序就会一直等。所以
就要开启多线程保证程序能向下运行,但是每个线程内读取request时,线程内又是阻塞的。所以多线程和阻塞非阻塞没关系的。
3.多线程和非阻塞(异步)的关系?一点关系没有!即使一个线程也可以是非阻塞或者异步运行的
4.阻塞非阻塞异步同步是针对方法说的,是评判一个方法运行状态的。
3.所以通常在Java中处理阻塞I/O要用到线程(大量的线程)。代码如下
try
{
ServerSocket ss = new
ServerSocket(10000);
System.out.println("server start...");
while
(true) {
Socket s = ss.accept();
new
LogicThread(s);//开一个线程来处理请求,这里面调用InputStream.read()读取请求信息
}
} catch
(Exception e) {
e.printStackTrace();
}
}
}
4.可以分析创建服务器的每个具体步骤。首先创建ServerSocket,然后接受新的连接请求,在LogicThread中处理请求。
传统IO方式(阻塞I/O)在调用InputStream.read()/buffer.readLine()方法时是阻塞的,它会一直等到数据到来或缓冲区已满时或超时时才会返回,并且产生了大量String类型
垃圾,尽管可以使用StringBuffer优化;同样,在调用ServerSocket.accept()方法时,也会一直阻塞到有客户端连接才会返回,每个客户端连接过来后,服务端都会启动一个线
程去处理该客户端的请求。并且多线程处理多个连接。每个线程拥有自己的栈空间并且占用一些 CPU 时间。每个线程遇到外部未准备好的时候,都会阻塞掉。阻塞的结果就是会
带来大量的进程上下文切换。且大部分进程上下文切换可能是无意义的。比如假设一个线程监听某一个端口,一天只会有几次请求进来,但是该 cpu 不得不为该线程不断做上下
文切换尝试,大部分的切换以阻塞告终。
5.非阻塞式I/O(NIO):也可以说成“New I/O”
核心类:
1.Buffer 为所有的原始类型提供 (Buffer) 缓存支持。
2.Charset 字符集编码解码解决方案
3.Channel 一个新的原始 I/O 抽象,用于读写Buffer类型,通道可以认为是一种连接,可以是到特定设备,程序或者是网络的连接。通道的类等级结构图如下
10.4.Selector
在过去的阻塞I/O中,我们一般知道什么时候可以向stream中读或写,因为方法调用直到stream准备好时返回。但是使用非阻塞通道,我们需要一些方法来知道什zid