Почему Java Thread ждать () работать только со сроком лимита здесь?

StackOverflow https://stackoverflow.com/questions/3581957

Вопрос

Я пытаюсь познакомиться с 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 мс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top