CuncurrentModificationException

225
19 апреля 2017, 11:35

Добрый день, при работе с 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();
    }
  }
}
READ ALSO
Зачем нужен finally?

Зачем нужен finally?

Допустим есть такой код

306
Создание второго PopupMenu

Создание второго PopupMenu

Есть приложение использованием карт googlemaps, в нем есть вызов popupmenu по нажатию кнопки в верхнем правом углу приложенияТеперь появилась необходимость...

210
Интерфейсы в Java

Интерфейсы в Java

Есть два интерфейса:

325
парсить вложенные объекты JSON на java

парсить вложенные объекты JSON на java

Добрый деньИмеется ответ от сайта в формате JSON вида:

332