К сожалению, моя программа вечно зависает в
selector.select() или всегда возвращает 0 по тайм-ауту.
Пожалуйста, помогите.
Код: Выделить всё
//To reduce size, I skipped unrelated functions.
// Port 1515, buffer size 126
private void setupSocketConnOperations() throws MarisCommsException {
ServerSocketChannel serverChannel = null;
Selector selector = null;
try {
serverChannel = ServerSocketChannel.open();
selector = Selector.open();
serverChannel.configureBlocking(false);
int ops = serverChannel.validOps();
InetSocketAddress socktAddr = new InetSocketAddress( "localhost", 1515);
serverChannel.bind(socktAddr);
LoggerService.logSocket("Server socket bound on port " + socketPortNo);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
int readyCount = 0;
LoggerService.logSocket("About to enter infinite loop");
while (true) {
try{
readyCount = selector.select(5000); // with timeout, hang on 5000, and then always return 0. if no timeout, hang on forever at here
if (readyCount == 0) {
Thread.sleep(500);
continue;
}
Set readyKeys = selector.selectedKeys();
Iterator i = readyKeys.iterator();
IMarisCommsMessageProtocol commsMsgProtocol = new MarisCommsMessageProtocol(buffer_size);// 126
while (i.hasNext()) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
if (key.isAcceptable()) {
try {
commsMsgProtocol.handleAccept(key);
}
catch (MarisCommsException e) {
LoggerService.logSocket("Failed to accept connection request from client: " + e.getMessage());
}
continue;
}
if (key.isValid() && key.isReadable()) {
try {
commsMsgProtocol.handleRead(key);
}
catch (MarisCommsException e) {
LoggerService.logSocket("Error during message read: " + e.getMessage());
}
}
if (key.isValid() && key.isWritable()) { ///TODO comment out msg sent
try {
commsMsgProtocol.handleWrite(key);
}
catch (MarisCommsException e) {
LoggerService.logSocket("Error during message write (Maris -> ICS: " + e.getMessage());
}
}
}
}catch (Exception e) {
Utility.handleException(e)
return;
}
finally {
}
}
}catch(Exception e2) {
}
}
Пожалуйста посмотрите на строку BootLoader.getNativeLibraries().find(entryName) в следующей
функции. Когда отладочная программа переходит к функции поиска и возвращается к этой строке в отладочном экспрессе, значение представляет собой большое
число, но разное в каждой отладке, например 140708885261832.
Теперь , если я нажму F5/F6/F7, курсор отладки исчезнет и больше не будет возможности контролировать
отладку.
Код: Выделить всё
package java.lang; class ClassLoader;
parameter: loader=null, entryName =Java_sun_nio_ch_WEPoll_wait, no timeout.
static long findNative(ClassLoader loader, String entryName) {
if (loader == null) {
return BootLoader.getNativeLibraries().find(entryName);
} else {
return loader.libraries.find(entryName);
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... on-forever