2
我需要質疑11M名稱服務器並找出其中哪些活着。在Java中,我使用異步套接字發送udp-requests,一切正常,直到我嘗試使用多個線程。雖然我使用了高性能的16核羣集,但速度卻成比例地上升,但積極響應急劇下降。 我爲每個線程創建了一個單獨的通道,並且沒有明顯的原因說明發生這種情況的原因。任何人都可以解釋我做錯了什麼,是否可以在線程中使用不同的異步套接字?Java異步套接字多線程性能
這是一些代碼。所以我有很多與ID線程,它的主機列表,他們每個人做到以下幾點:
@Override
public void run() {
DatagramChannel channel = null;
try {
channel = DatagramChannel.open();
InetSocketAddress isa = new InetSocketAddress(Settings.LOCAL_PORT+id);
channel.socket().bind(isa);
channel.configureBlocking(false);
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
ByteBuffer outBuffer = ByteBuffer.wrap(Settings.QUERY);
ByteBuffer inBuffer = ByteBuffer.allocate(200);
while (true) {
selector.select();
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
iterator.remove();
if (!key.isValid()) {
continue;
}
if (key.isReadable()) {
inBuffer.clear();
channel.receive(inBuffer);
inBuffer.flip();
inCounter++;
//some analize of response
continue;
}
if (key.isWritable()) {
if (outCounter < hosts.size()) {
channel.send(outBuffer, new InetSocketAddress(hosts.get(outCounter), Settings.DNS_PORT));
outBuffer.flip();
outCounter++;
}
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (channel != null)
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我們的心靈能力並不是那麼好。有些代碼可能會有幫助 –