第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));