简单点就是主线程selector.select(); 时候甩出新线程socketChannel.register(selector, SelectionKey.OP_READ);无法注册上selector.select(); 阻塞状态的selector。
public void init() throws Exception { //开始监听端口
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocket = serverSocketChannel.socket();
serverSocket.bind(new InetSocketAddress(PORT));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
start();
} @Override
public void run() {
System.out.println("始进行服务侦听:0.0.0.0:23456 ......");
while (true) {
selector.select();
for (Iterator it = selector.selectedKeys().iterator(); it
.hasNext();) {
SelectionKey selectionKey = (SelectionKey) it.next();
it.remove();
if (selectionKey.isAcceptable()) { //以上都是套路 !!当有连接
ServerSocketChannel server = (ServerSocketChannel) selectionKey
.channel();
new ConnectedThread(server.accept()); 甩出一个新线程 然后再线程中注册 socketChannel.register(selector, SelectionKey.OP_READ);// Thread.sleep(1000); 但在这里主线程sleep1秒 让上一行甩出的线程先注册到selector就行。
}
if (selectionKey.isReadable()) {
//做一些事情 问题是现在无法注册上Read }
}
}
}
}]
public void init() throws Exception { //开始监听端口
selector = Selector.open();
serverSocketChannel = ServerSocketChannel.open();
serverSocket = serverSocketChannel.socket();
serverSocket.bind(new InetSocketAddress(PORT));
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
start();
} @Override
public void run() {
System.out.println("始进行服务侦听:0.0.0.0:23456 ......");
while (true) {
selector.select();
for (Iterator it = selector.selectedKeys().iterator(); it
.hasNext();) {
SelectionKey selectionKey = (SelectionKey) it.next();
it.remove();
if (selectionKey.isAcceptable()) { //以上都是套路 !!当有连接
ServerSocketChannel server = (ServerSocketChannel) selectionKey
.channel();
new ConnectedThread(server.accept()); 甩出一个新线程 然后再线程中注册 socketChannel.register(selector, SelectionKey.OP_READ);// Thread.sleep(1000); 但在这里主线程sleep1秒 让上一行甩出的线程先注册到selector就行。
}
if (selectionKey.isReadable()) {
//做一些事情 问题是现在无法注册上Read }
}
}
}
}]
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货