1

我有一个学校作业,我将使用 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

您的(可能的)问题之一是本节不是原子的:

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调用(或两者)返回 null ,这会触发NullPointerException.

null您可以在调用之前添加检查descSort()。如果只有一个fgnull您可能需要将其放回显示器中(只是在这里猜测)。

于 2012-05-15T15:55:53.097 回答