CUBは子供の白熊

Java SE 8 実践プログラミングの練習問題を解く

第1章 ラムダ式とは : 問題 1 : Arrays.sort とスレッド

問題 1

Arrays.sortメソッドで呼び出されるComparatorのコードは、sortメソッドを呼び出したスレッドで実行されるか?

解答

sortメソッドのスレッドと同じスレッドで実行される。

■ 検証用コード

// 整列対象の配列の初期化
String[] array = new String[16*1024];
Random random = new Random();
for (int i = 0; i < array.length; i++) {
    array[i] = Double.toString(random.nextDouble());
}
// 整列処理
long threadID = Thread.currentThread().getId();
System.out.println("Main Thread is " + threadID);
Arrays.sort(array, (first, second) -> {
    if (Thread.currentThread().getId() != threadID) {
        System.out.println("Comparator Thread is " + Thread.currentThread().getId());
    }
    return first.compareToIgnoreCase(second);
});
System.out.println(Arrays.toString(array));

おまけ

上のラムダ式は、スレッドの確認処理がなければメソッド参照を使って

Arrays.sort(array, String::compareToIgnoreCase);

と書ける。

sortメソッドではなくparallelSortメソッドなら別スレッドになる。
ただしparallelSortメソッドは、配列がある程度のサイズにならないとマルチスレッドで実行されない。
私のマシンでは、8Kはシングルスレッドで、16Kはマルチスレッドになった。

■ 検証用コード

String[] array = new String[16*1024];
Random random = new Random();
for (int i = 0; i < array.length; i++) {
    array[i] = Double.toString(random.nextDouble());
}
long threadID = Thread.currentThread().getId();
Arrays.parallelSort(array, (first, second) -> {
    if (Thread.currentThread().getId() != threadID) {
        System.out.println("Comparator Thread is " + Thread.currentThread().getId());
    }
    return first.compareToIgnoreCase(second);
});
System.out.println(Arrays.toString(array));