小编Nil*_*esh的帖子

调用select()时,Java节点在使用选择器注册通道时阻塞.该怎么办?

我有一个基本问题.SelectableChannel的寄存器方法为何以及如何阻止调用.让我提供一个场景.

我在类Register中创建了一个Selector对象,如下所示.

private static Selector selector = Selector.open();
Run Code Online (Sandbox Code Playgroud)

我在同一类(寄存器)中也有一个方法用选择器注册通道.

public static SelectionKey registerChannel(SelectableChannel channel, int ops)
                             throws IOException {
   channel.configureBlocking(false);
   return channel.register(selector, ops);
}
Run Code Online (Sandbox Code Playgroud)

还有另一个名为Request的类,它具有从通道,进程和调用方法中读取数据以注册通道的方法.

selectonKey = Register.register(socketChannel, SelectionKey.OP_READ);
Run Code Online (Sandbox Code Playgroud)

在这一点上,线程被阻塞,没有提供它正在等待的线索.我已经确认选择器已打开.请帮助我了解如何解决此问题.我可以释放任何锁吗?

任何输入将不胜感激.

添加到我描述的内容中.进一步的测试显示,如果从同一个线程调用Register.register方法,它可以注册,但在此之后,如果其他一些线程尝试调用该方法,则线程不会继续前进.

java multithreading deadlock nio

14
推荐指数
3
解决办法
8065
查看次数

实现并发LinkedHashMap

我正在尝试为多线程体系结构创建并发LinkedHashMap.

如果我使用Collections#synchronizedMap(),我将不得不使用synchronized块进行迭代.此实现将导致元素的顺序添加.

如果我使用ConcurrentSkipListMap是有任何方法来实现Comparator顺序存储,如存储在链接列表或队列中.

我想使用java内置而不是第三方软件包.

编辑:

在此并发中LinkedHashMap,如果键是名称,我希望按顺序放置键.即新值将在开始或结束时附加到,但是顺序地附加.

迭代时,LinkedHashMap可以添加新条目,也可以删除.但迭代应该是添加条目的顺序.

我知道通过使用Collections#synchronizedMap(),必须实现用于迭代的同步块,但是在迭代时,地图是可修改的(可以添加/删除条目).

java collections concurrency

12
推荐指数
1
解决办法
2万
查看次数

java nio Selector唤醒

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

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

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

唤醒方法的javadoc说明:

如果在调用Selector.select()或Selector.select(long)方法时当前阻止了另一个线程,则该调用将立即返回.

PS其他几种解决办法; 其中一个是选择(超时)但我试图找出错误的位置.

伪代码:

第一线:

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
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

第二线:

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); …
Run Code Online (Sandbox Code Playgroud)

java nio

6
推荐指数
1
解决办法
5449
查看次数

java摇摆背景图像

我正在使用JFrame,我在我的框架上保留了背景图像.现在的问题是图像的大小小于帧的大小,所以我必须在窗口的空白部分再次保持相同的图像.如果用户单击最大化按钮,则可能必须在运行时将图像放在帧的空白区域.谁能告诉我如何实现这一目标?

java swing background image

5
推荐指数
2
解决办法
1万
查看次数