【发布时间】:2017-05-12 02:11:05
【问题描述】:
我目前正在尝试从一个线程操作 SocketChannel(我之前使用两个线程和常规套接字实现了我想要做的事情,但每个客户端两个线程似乎有点过分)。当有数据要读取时,我希望能够读取(选择器可以正常工作)。我只想在阻塞队列中有项目时写入(在我的示例中,我有帧队列)。
@Override
public void run() {
super.run();
SelectionKey readKey = null;
try {
final int interests = SelectionKey.OP_READ;
socketChannel.configureBlocking(false);
readKey = socketChannel.register(selector, interests);
} catch (IOException e) {
e.printStackTrace();
try {
close();
} catch (Exception e1) {
throw new RuntimeException("FAILURE");
}
}
if (null != readKey) {
while (running) {
try {
System.out.println("LOOP ENTRY");
selector.select();
if (readKey.isReadable()) {
System.out.println("IS READABLE");
}
if (readKey.isWritable() && (null != framesQueues.peek())) {
System.out.println("IS WRITEABLE");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
现在,它所做的是,它不停地疯狂循环,这显然很糟糕。我正在寻找一种方法,当我的阻塞队列中有一个项目时,或者当有要读取的字节时,我可以唤醒我的选择器。 NIO 中是否有允许这样做的工具?
如果没有,我可以实现什么?我注定要为每个客户端使用两个线程吗?这是一个爱好项目,但我试图实现尽可能低的延迟,所以循环睡眠不是我想要的。
【问题讨论】:
-
如果它是一个爱好项目,那为什么每个客户端两个线程会过多?
-
因为它似乎效率低下,而我正试图从中获得最大的性能。我可能不需要扩展,但我想要一个可以让我扩展(应对挑战)的解决方案。但是,如果每个客户端两个线程是最有效的解决方案,那么就是这样!至少对我来说这似乎是最自然的,它让我能够为每个需要尽快读写的客户提供良好的性能。
-
每个客户端我仍然需要两个线程吗?
标签: java multithreading sockets