2

我正在尝试熟悉 SCJP 的 Java 线程,但我有一个问题。

在下面编写的代码中,我简单地创建了:两个具有公共数据存储(一个数组)的 Runnable 和一个同步的 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();
    }

}

4

2 回答 2

5

您的线程都在等待并通知单独的对象-因此它们根本没有相互通信。如果您希望它们有效地相互释放,它们将需要一个共享监视器来同步、等待和通知。

当您指定超时时它正在“工作”,因为它有效地将等待调用转换为睡眠调用......仍然没有真正有用的等待/通知,因为两个线程仍在处理单独的监视器。

于 2010-08-27T06:53:00.107 回答
0

您的对象不在同一监视器中工作。

您需要将 wait() 和 notify() 移动到相同的对象,例如: http ://www.java-samples.com/showtutorial.php?tutorialid=306

or you can notify the target object: http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ315_016.htm

when you set wait(100). you are setting a timeout. and definitely it will wake up after 100ms.

于 2010-08-27T07:10:36.297 回答