0

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;
        }
    }
}

何らかの理由で、「単純なスレッド」が待機状態で永久にロックされます。どうなり得るか?

4

2 に答える 2

0

コメント - 間違いなく待ちます。SuperSortThread から通知していて、再び simpleSortThread を待っています。あなたは何かが真実になるのを待つことができます

while(flag){ source.wait()}

そして、他のスレッドからフラグの値を設定します。
何かが起こるのを待って、それが起こったら、何らかのタスクの実行を開始します。あなたは何も待っていません

于 2013-10-31T13:24:55.910 に答える