public class Solution {
public static void main(String[] args) {
new NoteThread().start();
new NoteThread().start();
}
public static class Note {
public static final List<String> notes = new ArrayList<>();
public static void addNote(String note) {
notes.add(0, note);
}
public static void removeNote(String threadName) {
String note = notes.remove(0);
if (note == null) {
System.out.println("Другая нить удалила нашу заметку");
} else if (!note.startsWith(threadName)) {
System.out.println("Нить [" + threadName + "] удалила чужую заметку [" + note + "]");
} else {
System.out.println("Нить [" + threadName + "] удалила свою заметку [" + note + "]");
}
}
}
public static class NoteThread extends Thread{
public void run(){
for (int i = 0; i < 1000; i++){
Note.addNote(getName() + "-Note" + i);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
Note.removeNote(getName());
}
}
}
}Roman Pavlenko
20 уровень
Добрый день! Вопрос очень волнует! Задача решена правильно, но при компиляции java выдает разные результаты: то два потока работают параллельно(что казалось бы правильным), то выдает в первые 10 циклов - java.lang.IndexOutOfBoundsException, и затем : "нить - 1 удаляет свою заметку" остальные 1000 ра
Обсуждается
Комментарии (3)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Vitaliy
7 января 2020, 14:34
Скорее всего проблема в синхронизации доступа к List<String> notes. В момент добавления(addNote) - удаления элемента(removeNote) разными нитями.
0
Dmitry QA Automation Engineer
13 сентября 2019, 05:56
Попробуйте цикл метода run() полностью запихнуть в try.
0
Roman Pavlenko
12 сентября 2019, 15:11
адача решена правильно, но при компиляции java выдает разные результаты: то два потока работают параллельно(что казалось бы правильным), то выдает в первые 10 циклов - java.lang.IndexOutOfBoundsException, и затем : "нить - 1 удаляет свою заметку" остальные примерно 1000 раз.
0