加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java nio Selector唤醒

发布时间:2020-12-15 01:11:20 所属栏目:Java 来源:网络整理
导读:请指出/给我一个selector.wakeup()的工作示例;两个线程之间的方法. 我试图创建一个简单的程序,其中一个线程正在等待selector.select()方法.第二个线程创建一些套接字并尝试向选择器注册;第一个线程被阻止的位置. 因此我需要使用选择器的唤醒方法,但不知何故

请指出/给我一个selector.wakeup()的工作示例;两个线程之间的方法.

我试图创建一个简单的程序,其中一个线程正在等待selector.select()方法.第二个线程创建一些套接字并尝试向选择器注册;第一个线程被阻止的位置.

因此我需要使用选择器的唤醒方法,但不知何故第一个线程不会出现阻塞模式.

唤醒方法的javadoc说明:

If another thread is currently blocked
in an invocation of the
Selector.select() or
Selector.select(long) methods then
that invocation will return
immediately.

P.S还有其他一些解决方法;其中一个是选择(超时)但我试图找出错误的位置.

伪代码:

第一线:

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);

}
最佳答案
如果您在选择器中注册它,则可能不希望线程2中的套接字被阻塞(因为选择器用于非??阻塞I / O).我认为通常的做法是让选择器处理与OP_CONNECT的连接(使用SocketChannel.finishConnection()).

看起来你可能在这里有潜在的竞争条件.想象一下这一系列事件:

>线程1:selector.select()
> …时间过去了……
>线程2:Thread1.selector.wakeup()
>线程1:检查密钥的可接受性
>线程1:检查键是否可读
>线程1:循环
>线程1:selector.select()
>线程2:尝试在选择器中注册(但这对于select()来说太迟了)

我建议让线程2设置一个SocketChannel,将它存放在线程1可以获取它的地方(确保在执行此操作时是线程安全的),然后唤醒选择器,让它检查它在线程1中的现有键并让线程1在再次调用Selector.select()之前注册新的SocketChannel.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读