1

IamがJavaのスレッドを使用して長い名前のリストを並べ替えるという学校の課題があります。ソートアルゴリズムの速度には焦点が当てられていませんが、スレッドとスレッドがソートの速度にどのように影響するかを理解するための割り当てです。

私は正しい道を進んでいるように感じますが、コード/スレッドがモニターを台無しにします。しばらくの間、問題を特定しようとしました。私にとっては、問題はclass SortThreads run()メソッドにあるようです。人々は私にいくつかのヒントやヒントを教えてもらえますか?

public void run() {

    while (monitor.getSize() > 1) {
        System.out.println("Number of array in list to be sorted: "
                + monitor.getSize());

        String[] f = monitor.getRandom();
        String[] g = monitor.getRandom();

        monitor.add(descSort(f, g));
    }

    System.out.println("*** THREAD DEAD ***");

}

出力:

After delete: 1
Number of array in list to be sorted: 3
Befor delete: 1
After delete: 0
Number of array in list to be sorted: 0
Exception in thread "Thread-101" java.lang.NullPointerException
    at SortThread.append(Sort.java:222)
    at SortThread.descSort(Sort.java:201)
    at SortThread.run(Sort.java:178)
Exception in thread "Thread-96" java.lang.NullPointerException
    at SortThread.append(Sort.java:222)
    at SortThread.descSort(Sort.java:201)
    at SortThread.run(Sort.java:178)
Number of array in list to be sorted: 0
Number of array in list to be sorted: 0
4

1 に答える 1

1

(考えられる)問題の1つは、このセクションがアトミックではないことです。

while (monitor.getSize() > 1) {
    System.out.println("Number of array in list to be sorted: "
            + monitor.getSize());

    String[] f = monitor.getRandom();
    String[] g = monitor.getRandom();

    monitor.add(descSort(f, g));
}

通常、スレッドを使用する場合は、呼び出しmonitor.getSize()monitor.getRandom()サイズの間で実際に変更されている可能性が非常に高くなります。getRandomしたがって、呼び出しの1つ(または両方)がnullを返し、それが。をトリガーすると思いますNullPointerException

nullを呼び出す前に、のチェックを追加できdescSort()ます。fとが1つしかない場合gnull、おそらくそれをモニターに戻す必要があります(ここで推測するだけです)。

于 2012-05-15T15:55:53.097 に答える