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