Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法退出等待方法_Java_Arrays_Multithreading_Synchronized - Fatal编程技术网

Java 无法退出等待方法

Java 无法退出等待方法,java,arrays,multithreading,synchronized,Java,Arrays,Multithreading,Synchronized,我正在编写一个简单的程序,将一个包含10个元素的整数数组排序到另一个长度相同的数组中。为此,我创建了10个线程,每个线程负责从源数组中获取其编号,并将其放入新数组中的正确位置 我有一个抽象类SortThread,它实现了Runnable。我还有两个子类扩展了上面的类,SuperSortThread(初始化源数组,对其编号进行排序并打印出数组)和SimpleSortThread(仅对其编号进行排序)。我试图在“超级线程”初始化数组时锁定源数组。然后,我打开锁。最后,我有一个创建和启动线程的主类 这

我正在编写一个简单的程序,将一个包含10个元素的整数数组排序到另一个长度相同的数组中。为此,我创建了10个线程,每个线程负责从源数组中获取其编号,并将其放入新数组中的正确位置

我有一个抽象类SortThread,它实现了Runnable。我还有两个子类扩展了上面的类,SuperSortThread(初始化源数组,对其编号进行排序并打印出数组)和SimpleSortThread(仅对其编号进行排序)。我试图在“超级线程”初始化数组时锁定源数组。然后,我打开锁。最后,我有一个创建和启动线程的主类

这是我的密码:

public abstract class SortThread implements Runnable {

    private final int tNumber;
    static int[] source = new int[10];
    static int[] dest;

    public SortThread(int tNumber) {
        this.tNumber = tNumber;
    }

    public final int lessThan() {
    /* Calculates the number of elements of source
         less than myNumber */

        int count = 0;

        for (int i = 1; i < 10; i++)
            if (source[tNumber] > source[i])
                count++;

        return count;
    }

    @Override
    public abstract void run();
}

出于某种原因,“简单线程”会被永久锁定在等待中。这可能是什么?

如果
超级端口线程
SimpleSortThread
之前运行(或者更具体地说是
source.notifyAll();
source.wait();
之前运行),那么当您尝试等待时,就没有任何东西可以通知您了。你将永远等待

这被称为一个。您可能应该在通知后设置一个标志,告知您已经通知的另一个线程,以便它不会等待

而且,
simplesorthread
依赖于
SuperSortThread
。没有它,你无法运行它


最后,也可能是最重要的一点,您在这里使用
等待
通知
究竟想要实现什么?我看不出你想要它做什么。

评论-它肯定会等待。您正在从SuperSortThread发出通知,并且再次等待simpleSortThread。你可以等待事情变得真实,比如

while(flag){ source.wait()}
并设置来自其他线程的标志值。

您等待某些事情发生,然后如果发生了,您就开始执行某些任务。您什么都不等待

也许您的
SuperSortThread.run()
是在
simplesorthread.run()之前调用的。所以输入wait(),但任务已经完成,notifyAll()丢失。我相信notifyAll会唤醒尚未处于等待区的线程。我修正了它,改变了同步调用的顺序,使同步块更接近。
public class SimpleSortThread extends SortThread {

    private int tNumber;

    public SimpleSortThread(int tNumber) throws InterruptedException {
        super(tNumber);
        this.tNumber = tNumber;
    }

    @Override
    public void run() {

        synchronized (source) {
            try {
                source.wait();
            } catch (InterruptedException e) {
                System.out.println("Wait error in simple thread");
            }

            int myNumber = source[tNumber];
            dest[lessThan()] = myNumber;
        }
    }
}
while(flag){ source.wait()}