1.什么是阻塞?
- 阻塞模式下,相关方法都会导致线程暂停
- ServerSocketChannel.accept 会在没有连接建立时让线程暂停
- SocketChannel.read 会在通道中没有数据可读时让线程暂停
- 阻塞的表现其实就是线程暂停了,暂停期间不会占用 cpu,但线程相当于闲置。
2.通过设置serverSocketChannel.configureBlocking(false)设置成非阻塞模式
package netty.io;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.ArrayList;
import java.util.List;
@Slf4j
public class ZuSeServer {
public static void main(String[] args) throws IOException {
//0Bytebuffer
ByteBuffer byteBuffer=ByteBuffer.allocate(16);
//1创建了服务器
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);//设置成非阻塞模式
//2绑定端口
serverSocketChannel.bind(new InetSocketAddress(8080));
//3连接的集合 存放channel
List<SocketChannel> channels=new ArrayList<>();
while(true){
//4 accept建立于客户端连接
log.info("connetcing...");
// System.out.println("connecting...");
SocketChannel sc = serverSocketChannel.accept();//也是阻塞
sc.configureBlocking(false);
log.info("connected...");
channels.add(sc);
for(SocketChannel channel:channels){
//5接受客户端发送的数据
log.info("before read",channel);
channel.read(byteBuffer);//也是阻塞
byteBuffer.flip();
// ByteBufferUtil.debugAll(byteBuffer);
byteBuffer.clear();
log.info("after read");
}
}
}
}