メインメソッドに1つのリストがあり、このリストを使用するために2つのスレッドを書きたいと思います。ときどき私はIndexOutOfBoundsExceptionを(スレッドがremoveメソッドを呼び出すと)synchronizedブロックで捕捉します。IndexOutOfBoundsException 2つのスレッドで同時に実行されるlist.remove
主な方法:
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();
}
}
貸衣装クラス:
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) {
}
}
}
}
}
プロデューサークラス:
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) {
}
}
}
}
スタックトレース:
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)
これは間違いなくこのコードで得られるエラーではありません。 'Arrays.asList'は何を返すと思いますか?あなたはjavadocを読んだことがありますか? – Savior
また、文字列を生成してリストに入れる別のスレッドがあります。私はそれを要約した。メインコードには新しいArraylistがあります。 –
そのため、実際に問題が再現された場合は、独自のコードをテストすることになっています。 Btw:リストの初期化を修正した後でも、このコードが問題を再現できるとは思いません。したがって、あなたのスレッドに通知するコードをポストすることもできます(これにより、そのリストが補充される可能性があります)。 – Tom