質問

SCJPのJavaスレッドに精通しようとしているので、質問がありました。

以下の書かれたコードでは、単純に作成しました。一般的なデータストレージ(配列)を備えた2つの実行可能性と同期write()メソッドは、各実行可能(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();
    }

}

役に立ちましたか?

解決

あなたのスレッドはそれぞれ待っていて、別々のオブジェクトに通知しているので、彼らは互いにまったく通信していません。あなたが彼らに効果的にお互いを解放したいなら、彼らは 共有 同期するために監視し、待機し、通知します。

タイムアウトを指定すると、待機コールをスリープコールに効果的に回すため、「動作」しています... 2つのスレッドがまだ個別のモニターを扱っているため、まだ何も待っている/通知していません。

他のヒント

オブジェクトは同じモニターで機能していません。

wait()を移動し、次のようなオブジェクトに通知()を移動する必要があります。http://www.java-samples.com/showtutorial.php?tutorialId=306

または、ターゲットオブジェクトに通知することができます。http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/tij315_016.htm

待機を設定したとき(100)。タイムアウトを設定しています。そして間違いなくそれは100ms後に目覚めます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top