Почему Java Thread ждать () работать только со сроком лимита здесь?
-
01-10-2019 - |
Вопрос
Я пытаюсь познакомиться с Java Threads для SCJP, и у меня возник вопрос.
В письменном ниже следующем коде я просто создал: две разных запуска с общим хранением данных (массивом) и синхронизированным методом записи () для заполнения его данных, последовательно оставляя букву в качестве метки для каждого родительского (A и B) в последовательности. Отказ
Я знаю, что код грубый и может быть лучше написан, но я искал мораль потоков.
Так что теперь, когда я бегу, это никогда не заканчивается, а результаты останавливаются на:
Все еще хорошо. A0.
Но когда я меняю жду () ждать (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();
}
}
Решение
Ваши темы каждый ждет и уведомляет отдельные объекты - поэтому они вообще не общаются друг с другом. Если вы хотите, чтобы они эффективно освободили друг друга, им понадобится общий Монитор, чтобы синхронизировать, ждать и уведомить.
Это «работает», когда вы указываете тайм-аут, потому что он эффективно превращает вызов ожидания в вызов сна ... По-прежнему ничего не действительно ждет / уверенно, потому что два потока все еще имеют дело с отдельными мониторами.
Другие советы
Ваши объекты не работают в одном мониторе.
Вам нужно либо переместить ожидание () и уведомлять () к тому же объекту, как:http://www.java-samples.com/showtutorial.php?tutorialid=306.
Или вы можете уведомить целевой объект:http://www.linuxtopia.org/online_books/programming_books/Thinking_in_java/tij315_016.htm.
Когда вы установите жду (100). Вы устанавливаете тайм-аут. И определенно это просыпается после 100 мс.