我有一个基本问题.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方法,它可以注册,但在此之后,如果其他一些线程尝试调用该方法,则线程不会继续前进.
我正在尝试为多线程体系结构创建并发LinkedHashMap.
如果我使用Collections#synchronizedMap(),我将不得不使用synchronized块进行迭代.此实现将导致元素的顺序添加.
如果我使用ConcurrentSkipListMap是有任何方法来实现Comparator顺序存储,如存储在链接列表或队列中.
我想使用java内置而不是第三方软件包.
编辑:
在此并发中LinkedHashMap,如果键是名称,我希望按顺序放置键.即新值将在开始或结束时附加到,但是顺序地附加.
迭代时,LinkedHashMap可以添加新条目,也可以删除.但迭代应该是添加条目的顺序.
我知道通过使用Collections#synchronizedMap(),必须实现用于迭代的同步块,但是在迭代时,地图是可修改的(可以添加/删除条目).
请指出/提供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) 我正在使用JFrame,我在我的框架上保留了背景图像.现在的问题是图像的大小小于帧的大小,所以我必须在窗口的空白部分再次保持相同的图像.如果用户单击最大化按钮,则可能必须在运行时将图像放在帧的空白区域.谁能告诉我如何实现这一目标?