マルチスレッドの基本原則

Java におけるコードの最適化

Pavlos Kosmetatos

Lead Engineer @Wealthyhood

逐次実行と並列実行

  • 逐次処理 -> 操作が1つずつ順番に実行される
  • 並列処理 -> 複数の操作が同時に実行される

どうやって?

  • 最近の CPU には複数のコアがある
  • スレッド:プログラム実行の最小単位
  • マルチスレッドはこれらのコアに処理を分散する

シングルスレッドは、車が一列に並んで走る一車線の道路のようなものです。マルチスレッドは、複数の車線があり、車が同時に走れる道路のようなものです!

Java におけるコードの最適化

スレッドの使用

  • Thread クラスを使うと新しい実行パスを作成できる
  • 各 Thread は独立して実行できる
Runnable task = () -> {
    System.out.println("Processing on thread: " + 
                       Thread.currentThread().getName());
};

Thread thread = new Thread(task);
thread.start();
Processing on thread: Thread-0
Java におけるコードの最適化

複数スレッドの操作

List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 4; i++) {
    Thread thread = new Thread(() -> System.out.println("Processing data on Thread-" + i));
    threads.add(thread);
    thread.start();
}

for (Thread t : threads) {
    t.join(); // Waits for all threads to complete
}
// Processing data on Thread-0
// Processing data on Thread-2
// Processing data on Thread-1
// Processing data on Thread-3
Java におけるコードの最適化

並列ストリーム

  • ストリーム - Java 8 以降の並列処理を簡素化する機能
  • スレッドの作成と管理を自動で処理する
  • 作成方法は2通り:
    • collection.parallelStream()
    • Stream.of(...).parallel()
Java におけるコードの最適化

並列ストリームの例

// Sequential processing
List<Integer> result1 = new ArrayList<>();
for (int i = 0; i < numbers.size(); i++) {
    result1.add(numbers.get(i) * 2);
}

// Sequential processing with stream List<Integer> result2 = numbers.stream() .map(n -> n * 2) .collect(Collectors.toList());
// Parallel processing with parallel stream List<Integer> result3 = numbers.parallelStream() .map(n -> n * 2) .collect(Collectors.toList());
Java におけるコードの最適化

並列処理を使うタイミング

  • CPU 負荷の高い操作
  • 独立したデータ処理
  • 大規模なデータコレクション
  • 使用可能な CPU コアが2つ以上
  • 並列化のオーバーヘッドが見合わない場合:
    • 小規模なデータセット
    • 単純な操作
Java におけるコードの最適化

まとめ

  • 並列実行パスを作成する Thread クラス
  • コレクション処理を簡素化する並列ストリーム
  • メリットは次の要素に左右される:
    • ワークロードの種類
    • データサイズ
    • 使用可能なコア数
Java におけるコードの最適化

練習しましょう!

Java におけるコードの最適化

Preparing Video For Download...