Я провел некоторое исследование и не смог найти решение этой проблемы.Где я должен использовать синхронизированный?
Из этой темы Synchronization, When to or not to use? я понимаю, что могу использовать synchronized
, но это не решает проблему.
Дело в том, что у меня есть метод, в котором Thread
используется для создания ArrayList
. В том же Thread
еще один method
вызывается после того, как BufferedReader
закончил чтение файла, и строки добавляются в первый список.
Во втором методе первый список используется для создания второго списка. Когда все это будет сделано, первый метод использует второй список.
Это код, который я использую, если есть что-то непонятное, спросите, и я постараюсь предоставить необходимую информацию.
public synchronized void theBaseList() {
Thread t = new Thread() {
@override
public void run() {
try(
while((line = br.readLine()) != null) {
firstList.add(line):
}
}
nextMethod();
currentObject = (Object[]) secondList.get(0); // throws an exception
}
}
};
t.start();
public synchronized void nextMethod() {
Thread t1 = new Thread(){
double objectListSize = calculateObjectListLength(firstList.size());
@override
public void run() {
try {
// create Objects
secondList.add(objects);
}
}
};
t1.start();
}
Когда я использую в nextMethod()
Thread
создать новый list
объектов из элементов в первом списке, я получаю ArrayIndexOutOfBoundsException
говоря
Исключение в потоке " Thread-4 "java.lang.IndexOutOfBoundsException: Индекс: 0, Размер: 0
Я избегал этого, не используя Thread
во втором методе, и все работает нормально.
Если я использую 2 Threads
и делаю оба метода synchronized
, он по-прежнему исключает.
Возможно ли это или я должен просто решить, не используя Thread
во втором методе? Я думал, synchronized
был для решения подобных проблем. Я не понимаю, почему это не работает.
ли вы имеете в виду »методы при работе в отдельных потоках? – EJP
@EJP Да, один метод получает вызов из потока в первом методе. – WonderWorld
Здесь, по-видимому, нет причин использовать отдельные потоки. Операции являются серийными. 't1' зависит от' t', чтобы завершить заполнение первого списка, а 't' зависит от' t1', чтобы добавить ко второму списку. – Radiodef