Java

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:同步非阻塞

NIO最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器(selector)上面,所以所有的连接只需要一个线程就可以搞定了,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求(通道)一个线程的模式。但是开启线程之后可能还是会等待后端应用,例如JDBC连接等,这个线程其实还是被阻塞的,当并发高的时候,有BIO相同的问题。

1.png

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(已被放弃)


上一篇下一篇

猜你喜欢

热点阅读