10 要素の整数配列を同じ長さの別の配列に並べ替える単純なプログラムに取り組んでいます。これを行うために、10 個のスレッドを作成し、それぞれがソース配列からその番号を取得して、新しい配列の正しい位置に配置します。
Runnableを実装する抽象クラスSortThreadがあります。上記のクラスを拡張する 2 つのサブクラスもあります。「スーパースレッド」が配列を初期化する間、ソース配列をロックしようとしています。次に、ロックを解除します。最後に、スレッドを作成して開始するメイン クラスを用意しました。
これが私のコードです:
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();
}
import static java.lang.Thread.sleep;
public class SuperSortThread extends SortThread {
private int tNumber;
public SuperSortThread(int tNumber) {
super(tNumber);
this.tNumber = tNumber;
}
private static void printArray(int[] number) {
System.out.print("\nVector: ");
for (int i = 0; i < 10; i++)
System.out.print(number[i] + " ");
}
@Override
public void run() {
synchronized (source) {
source[0] = 5;
source[1] = 7;
source[2] = 6;
source[3] = 3;
source[4] = 8;
source[5] = 9;
source[6] = 4;
source[7] = 0;
source[8] = 1;
source[9] = 2;
dest = new int[10];
source.notifyAll();
printArray(source);
int myNumber = source[tNumber];
dest[lessThan()] = myNumber;
try {
sleep(1000);
} catch (InterruptedException e) {
System.err.println("Error in Sleep.");
}
printArray(dest);
}
}
}
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;
}
}
}
何らかの理由で、「単純なスレッド」が待機状態で永久にロックされます。どうなり得るか?