BIO NIO AIO
2019-03-22 本文已影响6人
强某某
BIO: 同步阻塞
BIO是来一个连接建立一个线程,可以使用线程池改进性能
线程池案例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class SingleThreadPollDemo {
public static void main(String[] args) {
// 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程。
ExecutorService pool = Executors.newSingleThreadExecutor();
Runnable task1 = new SingelTask();
Runnable task2 = new SingelTask();
Runnable task3 = new SingelTask();
pool.execute(task3);
pool.execute(task2);
pool.execute(task1);
// 等待已提交的任务全部结束 不再接受新的任务
pool.shutdown();
}
}
class SingelTask implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "正在执行… …");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "执行完毕");
}
}
NIO:同步非阻塞
1.pngNIO最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器(selector)上面,所以所有的连接只需要一个线程就可以搞定了,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求(通道)一个线程的模式。但是开启线程之后可能还是会等待后端应用,例如JDBC连接等,这个线程其实还是被阻塞的,当并发高的时候,有BIO相同的问题。
Buffer(缓冲区):ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer
Channel(通道):SocketChannel,ServerSocketChannel
Selector(多路复用器): Selector,AbstractSelector
AIO: 一部非阻塞
与NIO不同,当进行读写操作的时候,只需直接调用API的read或者write方法即可,这两种方法均为异步,完成后会主动调用回调函数;出现在JDK1.7,也被称为NIO2.0
新增下面四个异步通道
AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel(已被放弃)