我试图熟悉SCJP的Java线程,我有一个问题。

在以下代码中,我简单地创建了:两个带有共同数据存储(数组)和同步写入()方法的运行可运行,将其连续填充数据填充字母作为每个可运行(a和b)的标记。

我知道代码很粗糙,可以更好地编写,但是我正在寻找线程的道德。

因此,现在当我运行它时,它永远不会终止,结果停在:

还好。 A0。

但是,当我更改Wait()等待(100)时,它可以正常计数到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();
    }

}

有帮助吗?

解决方案

您的线程各自等待并通知单独的对象 - 因此它们根本不相互通信。如果您希望他们有效地释放,他们将需要一个 共享 监视以同步,等待并通知。

当您指定超时时,它是“工作”的,因为它有效地将等待电话转换为睡眠电话...仍然没有什么真正等待/通知有可能的,因为这两个线程仍在处理单独的显示器。

其他提示

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

您需要将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