Добрый день, при работе с java.nio возникает CuncurrentModificationException, вроде стараюсь использовать iterator, и удалять элементы, но всеравно, при одновременном подключении более 10 пользователей, исключение. Вот метод.
class SocketServiceImpl {
private ServerSocketChannel serverSocketChannel;
private Selector selector;
public static void main(String[] args) throws IOException {
ServerSocketChannel serverSocketChannel;
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress("localhost", 9000));
serverSocketChannel.configureBlocking(false);
Selector selector = Selector.open();
this.selector = selector;
while (serverSocketChannel.isOpen()) {
work();
}
}
public static void work() {
Iterator<SelectionKey> iterator;
try {
this.selector.select();
} catch (IOException e) {
e.printStackTrace();
}
iterator = this.selector.selectedKeys().iterator();
while (iterator.hasNext()){
SelectionKey selectionKey = iterator.next(); // тут exception
iterator.remove();
try {
if (selectionKey.isAcceptable()) {
ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
SocketChannel socketChannel = serverSocketChannel.accept();
String address = getAddress(socketChannel);
socketChannel.configureBlocking(false);
socketChannel.register(this.selector, SelectionKey.OP_READ, address);
server.onConnect(address);
}
if (selectionKey.isReadable()) {
SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
String address = getAddress(socketChannel);
server.onAction(address);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Тестирую в 10 потоков из
class Test {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
final int n = i;
new Thread(() -> {
try {
test(n);
} catch (InterruptedException e) {
e.printStackTrace();
}
}).start();
}
}
private static void test(int n) throws InterruptedException {
Socket socket;
try {
int PORT = 9000;
String HOST = "localhost";
socket = new Socket(HOST, PORT);
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true);
printWriter.println("hello"+n);
printWriter.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть приложение использованием карт googlemaps, в нем есть вызов popupmenu по нажатию кнопки в верхнем правом углу приложенияТеперь появилась необходимость...