Я пытаюсь ознакомиться с потоками Java для SCJP, и у меня возник вопрос.
В приведенном ниже коде я просто создал:
два Runnables с
общее хранилище данных (массив) и
синхронизированный метод write () для последовательного заполнения данными, оставляя букву в виде метки для каждого Runnable (A и B) в последовательности.
Я знаю, что код груб и может быть лучше написан, но я искал мораль потоков.
Так что теперь, когда я запускаю его, он никогда не заканчивается и результаты останавливаются на:
Все еще хорошо.
A0.
Но когда я меняю wait () на wait (100), он отлично работает, считая от 0 до 9, и завершается нормально. Может ли кто-нибудь объяснить мне причину этого, пожалуйста?
Спасибо.
public class ArrayThreads {
Object[] array = new Object[10];
boolean isA = true;
int position = 0;
int getIndex(){
return position;
}
class ThreadA implements Runnable{
synchronized void write(String value){
while(!isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("A");}
}
}
class ThreadB implements Runnable{
synchronized void write(String value){
while(isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("B");}
}
}
public static void main(String[] args){
ArrayThreads threads = new ArrayThreads();
Thread threadA = new Thread(threads.new ThreadA());
Thread threadB = new Thread(threads.new ThreadB());
System.out.println("Still good");
threadB.start();
threadA.start();
}
}