Java 入門

ホーム > マルチスレッド > マルチスレッドプログラミングの基本

マルチスレッドプログラミングの基本

スレッド (thread) というのは簡単に言えば、プログラムの処理の流れのことです。

特に何もしなければ、あなたの書いたコードは最初から順番にひとつひとつ処理され終了します。

ローレベルのプログラミング環境の場合、スレッドを起動したらそのスレッドの処理の開始アドレスを関数ポインタで渡して処理を開始する・・・、 というような流れになるのが一般的だったりしますが、 オブジェクト指向の Java では少々勝手が違います。

Java でのマルチスレッドプログラミングの基本

まず、Runnable インターフェイスを実装した Runnable オブジェクトを作成します。 これが処理単位になることから、 Runnable オブジェクトはタスクと言い換えられたりします。

Runnable インターフェイスは run メソッドを一つだけ持つ単純なインターフェイスです。

このタスク (Runnable オブジェクト) をスレッドオブジェクトに渡し、スレッドを開始すると、タスクの所定の処理が行われます。 これが Runnable インターフェイスの run メソッドの実行というわけです。

では早速実装例を示します。

package com.keicode.java.test;

public class ThreadTest0 {

  public static void main(String[] args) {
    
    System.out.println("Entering main " 
      + Thread.currentThread().getId());
    
    try {
      Thread thread = new Thread(new Runnable(){
        public void run() {
          System.out.println("Hello! " 
            + Thread.currentThread().getId());
        }
      });
      thread.start();
      thread.join();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    System.out.println("Exit main");
  }

}

この実行結果は次のようになります。

Entering main 1
Hello! 8
Exit main

main 関数が始まるとまず "Entering main" というメッセージと、現在のスレッドの ID を出力します。

次にスレッドオブジェクトを作成しています。 このとき Thread のコンストラクタに Runnable オブジェクトを渡しています。 インターフェイス名を持ってきていきなり new するのは、 匿名内部クラス というものなので、 違和感のある人は解説ページをみてください。

Thread の start メソッドで処理を開始します。これによって run メソッドが新しく作成したスレッド上で実行されることになります。

上の実行例でも確かに、 Hello! というメッセージを出力しているのは、 ID = 8 のスレッドであることがわかりますね。

次に join メソッドを呼んでいます。これはそれを呼び出したスレッドが、 スレッドの完了を待つためのものです。 具体的にはこの場合、 main を実行しているメインスレッドが、新しく作成したスレッドが完了するまで待ちます。

ホーム > マルチスレッド > マルチスレッドプログラミングの基本