2014-12-02 2 views
0

У меня возникла проблема при повторении ArrayList из сокетов. Цель этого списка - отправить сообщение всем клиентам, если другой подключается, кроме последнего. Я получаю ConcurrentModificationException, и я не знаю, как управлять им. Пожалуйста помоги!ConcurrentModificationException при отправке сообщения всем клиентам

программа сервера:

public void start() { 

    try { 
     serverSocket = new ServerSocket(10001); 
     thread = new Thread(new MessageClient(listOfClients)); 
     thread.start(); 
     while (!isStopped) { 
     socket = serverSocket.accept(); 
     listOfClients.add(socket); 
     synchronized (listOfClients) { 
      listOfClients.notifyAll(); 
     } 
     g.getTextArea().append(
      "Client number " + listOfClients.size() 
       + " has connected.\n"); 
     threadClient = new Thread(new SerThread(socket, listOfClients)); 
     threadClient.start(); 
     } 
    } catch (IOException e) { 
    } 
    } 

программа Thread (MessageClient):

public void run() { 
    while (true) { 
     for (Iterator<Socket> cl = listOfClients.iterator(); cl.hasNext();) { 
     synchronized (listOfClients) { 
      cur = cl.next(); 
      if (!cur.equals(listOfClients.get(listOfClients.size() - 1))) { 
      try { 
       System.out.println("dddddddd"); 
       ous = new PrintWriter(cur.getOutputStream()); 
       ous.println("Client " + listOfClients.size() 
        + " has connected."); 
       ous.flush(); 
      } catch (IOException e) { 
       JOptionPane 
        .showMessageDialog(null, 
         "There was a problem getting your outputstream."); 
      } 
      try { 
       System.out.println("ddd"); 
       listOfClients.wait(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 
     } 
    } 
    } 
+0

Вставить трассировку стека. Обычно вы получаете ConcurrentModificationException, когда пытаетесь изменить отказоустойчивую коллекцию при ее итерации. Проверьте, где вы можете это делать, преднамеренно или иначе. – Nazgul

+1

@Nazgul DDDDDDDD ддд Exception в потоке java.util.ConcurrentModificationException "Thread-0" \t в java.util.ArrayList $ Itr.checkForComodification (ArrayList.java:886) \t в java.util.ArrayList $ Itr.next (ArrayList.java:836) \t в com.omisoft.basic_java.networking_and_gui.task4.MessageClient.run (MessageClient.java:24) \t в java.lang.Thread.run (Thread.java:745) Это стек. –

ответ

0

Вы пытаетесь переделал свою коллекцию listOfClients.add(socket) в одну тему (на сервере), в то время как другой поток MessageClient итерация над ним.

+0

Не могли бы вы помочь мне с некоторым решением? Спасибо за ответ в любом случае! –

+0

Заполните свой списокOfClients перед началом потока с MessageClient –

+0

Как заполнить его, когда я могу подключить клиентов в любое время? –

1

Решение этой проблемы было связано с использованием только synchronizedList. Он автоматически выполняет синхронизацию между потоками.