1.4.5、多线程多work轮询
@Slf4j
public class ThreadServerWorks {
public static void main(String[] args) throws IOException, InterruptedException {
Thread.currentThread().setName("boss thread");
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
Selector bossSelector = Selector.open();
ssc.register(bossSelector, SelectionKey.OP_ACCEPT);
ssc.bind(new InetSocketAddress(50001));
Worker[] workers = new Worker[2];
for (int i = 0; i < workers.length; i++) {
workers[i] = new Worker("work thread-" + i);
}
AtomicInteger index = new AtomicInteger();
while (true) {
bossSelector.select();
Iterator<SelectionKey> iter = bossSelector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();
if (key.isAcceptable()) {
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
log.debug("connected...{}", sc.getRemoteAddress());
log.debug("before register...{}", sc.getRemoteAddress());
workers[index.getAndIncrement() % workers.length].register(sc);
log.debug("after register...{}", sc.getRemoteAddress());
}
}
}
}
@Data
static class Worker implements Runnable {
private String name;
private Selector workSelector;
private volatile boolean flag = false;
public Worker(String name) {
this.name = name;
}
public void register(SocketChannel sc) throws IOException {
if (!flag) {
workSelector = Selector.open();
new Thread(this, name).start();
flag = true;
}
workSelector.wakeup();
sc.register(workSelector, SelectionKey.OP_READ, null);
}
@Override
public void run() {
while (true) {
try {
workSelector.select();
Iterator<SelectionKey> iter = workSelector.selectedKeys().iterator();
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();
if (key.isReadable()) {
ByteBuffer buffer = ByteBuffer.allocate(16);
SocketChannel sc = (SocketChannel) key.channel();
log.debug("read...{}", sc.getRemoteAddress());
sc.read(buffer);
buffer.flip();
ByteBufferUtil.debugAll(buffer);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
2021-10-12 阿里云的这群疯子