请为我提供一个关于两个线程之间使用
我尝试创建一个简单的程序,在其中一个线程正在等待selector.select()方法。第二个线程创建一些套接字并尝试在selector上注册;此时第一个线程被阻塞。
因此,我需要使用selector的
wakeup方法的javadoc说明如下:
如果另一个线程当前正在调用Selector.select()或Selector.select(long)方法,则该调用将立即返回。
附注:有一些其他的解决方法;其中之一是select(timeout),但我正在努力找出错误所在。
伪代码如下:
第一个线程:
selector.wakeup();
方法的可行示例。我尝试创建一个简单的程序,在其中一个线程正在等待selector.select()方法。第二个线程创建一些套接字并尝试在selector上注册;此时第一个线程被阻塞。
因此,我需要使用selector的
wakeup
方法,但是第一个线程似乎没有退出阻塞模式。wakeup方法的javadoc说明如下:
如果另一个线程当前正在调用Selector.select()或Selector.select(long)方法,则该调用将立即返回。
附注:有一些其他的解决方法;其中之一是select(timeout),但我正在努力找出错误所在。
伪代码如下:
第一个线程:
static Selector selector = Selector.open();
while(true) {
int n = selectorGlobal.select();
selectorKeySet = selectorGlobal.selectedKeys().iterator();
while (selectorKeySet.hasNext()) {
selectionKey = selectorKeySet.next();
if (selectionKey.isReadable()) {
//do something
}
if(selectionKey.isAcceptable()) {
//accept
}
}
}
第二个线程:
while (itr.hasNext()) {
data = (String) itr.next();
String IP = data.get(0);
String Port = data.get(1);
SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(true);
boolean isConnected = socketChannel.connect(new InetSocketAddress(IP, Port));
ClassName.selector.wakeup();
SelectionKey selectionKey = SelectSockets.registerChannel(ClassName.selector,
socketChannel, SelectionKey.OP_READ);
}