Ana yöntemde bir liste var ve bu listeyi kullanmak için iki iş parçacığı yazmak istiyorum. Bazen senkronize blokta IndexOutOfBoundsException'ı yakalarım (iş parçacığı çağrıları kaldırdığında).indexOutOfBoundsException list.remove aynı anda 2 iş parçacığıyla (aynı anda) çalıştır
Ana yöntemi:
public class PC {
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
new Costumer("c1", strings).start();
new Costumer("c2", strings).start();
new Producer("p1", strings).start();
new Producer("p2", strings).start();
new Producer("p3", strings).start();
new Producer("p4", strings).start();
}
}
Müşteri sınıfı:
class Costumer extends Thread {
List<String> strings;
public Costumer(String n, List<String> strings) {
super(n);
this.strings = strings;
}
@Override
public void run() {
while (true) {
synchronized (strings) {
try {
if (strings.isEmpty()) {
strings.wait();
}
strings.remove(0); // <- where exception is thrown
} catch (InterruptedException ex) {
}
}
}
}
}
Üretici sınıfı:
class Producer extends Thread {
List<String> strings;
public Producer(String n, List<String> strings) {
super(n);
this.strings = strings;
}
@Override
public void run() {
while (true) {
synchronized (strings) {
strings.add(String.valueOf(Math.random() * 1000));
if (strings.size() == 1) {
strings.notify();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
}
}
}
}
Yığın iz:
Exception in thread "c2" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at Costumer.run(PC.java:40)
Bu kodla aldığınız hata kesinlikle değil. Ne düşünüyorsunuz? Arrays.asList' geri döndü? Javadoc'unu okudun mu? – Savior
Ayrıca string üretmek ve bunları listeye eklemek için başka bir iş parçacığım var. Bunu özetledim. ana kodda yeni Arraylist var. –
Bu yüzden problemi gerçekten üretiyorsa kendi kodunuzu test etmeniz gerekiyor. Btw: Listenin başlatılmasını düzelttikten sonra bile bu kodun sorunu yeniden üretemeyeceğini sanmıyorum. Bu nedenle, işitme cihazınızı bildiren kodu da gönderin (bu, bu listeyi yeniden doldurabileceğinden). – Tom