Я новичок в использовании ниток. В другом классе создается и запускается экземпляр класса ConnectionMaster (расширяет поток). Объект Client присваивается объекту ConnectionMaster, который добавляет его в список. Метод overridden run() класса Thread существенно прослушивает добавление клиента в список. Действительно, он прослушивает и «слышит», когда объект Client добавляется в список. Однако, хотя .hasNext() возвращает true .Next() вызывает исключение. Что я делаю не так?Исключение в теме "Thread-0" java.util.NoSuchElementException?
следующие методы из класса ConnectionMaster, который проходит Тема:
Конструктор
public ConnectionMaster(){
clients = new Vector<>();
listIterator = clients.listIterator();
}
Открытый метод для добавления клиента объектов в список
@Override
public synchronized void addClient(Client client) {
listIterator.add(client);
}
Это переопределяется метод резьбы класс Thread. Он последовательно проверяет элементы, добавленные в список.
@Override
public void run(){
while(true){
while(listIterator.hasNext()){
processClient(listIterator.next()); //this is where error occurs
listIterator.remove();
}
while(listIterator.hasPrevious()){
processClient(listIterator.previous());
listIterator.remove();
}
}
}
////////////////////////////// ОБНОВЛЕНИЕ ////////// ////////////////////////// Спасибо OldCurmudgeon и Stephen C. На основании вашего отзыва, мой код был изменен таким образом:
Конструктор
public ConnectionMaster(){
clients = new ArrayBlockingQueue<Client>(1024);
}
Способ для приема клиента объекты
@Override
public synchronized void addClient(Client client) {
try {
clients.put(client);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Слушатель
@Override
public void run(){
while(true){
try {
processClient((Client)clients.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Можете ли вы включить трассировку стека. –