#java #исключения
Разве это возможно? Объясните пожалуйста, когда такое возможно и почему? Даже не знаю, как показать какой-либо кусок кода. Во-первых, ситуация очень странная. Во-вторых, к ней меня привела длинная цепочка вызовов (классы сильно взаимосвязаны). Даже не могу предположить где может быть проблема. Скажу только, что я получаю исключение запуская сложную задачу в SwingWorker. UPD: Благодаря полученным ответам, я понял на какой метод следует обратить наиболее пристальное внимание: @Override protected Void doInBackground() throws Exception { solver = new MultidimensionalSolver(manager.getTask()); manager.getTask().setSolution(solver.getSolution().getSolution()); while (!solver.isSolutionFind() && flag) { solver.findSolution(); manager.getTask().setSolution( solver.getSolution().getSolution()); publish(); iter++; } return null; } Здесь класс MultidimensionalSolver работает с теми же данными, которые выводятся на экран в методе process(), вызываемом при вызове publish(). Получается поток в методе publish настолько обгоняет поток в методе doInBackground?
Ответы
Ответ 1
Такое может запросто случиться, если доступ к вашему ArrayList идет из нескольких потоков, при этом отсутствует синхронизация. Судя по тому, что вы используете SwingWorker, именно это и происходит. Сценарий может быть такой: Первый поток пытается взять элемент с индексом 2. При этом в коллекции, допустим, всего 1 элемент. В методе rangeCheck код этого потока заходит внутрь условия: private void rangeCheck(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } Второй поток добавляет 2 элемента (теперь их становится 3). Первый поток выбрасывает исключение со странным сообщением, поскольку метод outOfBoundsMsg подхватил новое значение size. Решение: синхронизировать доступ (и чтение, и запись) к коллекции с помощью локов, либо использовать потокобезопасный вариант коллекции.
Комментариев нет:
Отправить комментарий