マルチスレッド

はじめに

とある事情からマルチスレッドについて知識を蓄える必要が出てきたので,備忘録がてら.今回のエントリでは,「スレッドとは何か」「マルチスレッドの起動方法」について述べる.

スレッドとは何か

プログラムを実行している主体のこと.プログラムを書いていると,その処理の流れは「糸」のように続いていく.この処理の流れのことをスレッドという.スレッドは,「シングルスレッド」と「マルチスレッド」に分類される.

【シングルスレッド】
処理の流れである「糸」,つまり「スレッド」が1つだけのスレッドをシングルスレッドという.例えば,以下のようなプログラムはシングルスレッドである.

public class Main {
    public static void main(String[] args) {
        for(int i=0;i<10;i++) {
            System.out.println("Hello, world!");
        }
    }
}

実際に指で処理をなぞってみると分かると思うが,10回ループをぐるぐる回ってその都度文字列を出力している.処理をなぞるのに必要な指の数は1本だけでいい.これがシングルスレッドのプログラムである.

【マルチスレッド】
処理の流れであるスレッドが2本以上あるスレッドのことをマルチスレッドという.複数の処理を「並行」に,つまり処理の順番は問わずに複数の処理を実行することができる.マルチスレッドの起動方法は後述する.

マルチスレッドの起動方法

マルチスレッドの起動方法には2つある.

●Threadクラスの拡張(extends)を使う方法
[キーワード]
Threadクラス,extends,startメソッド,runメソッド
[手順]
・Threadクラスを拡張したクラスを定義(MyClassとする).定義したMyClass内でrunメソッドを記述.
・定義したMyClassのインスタンスを生成.
・そのインスタンスで,startメソッドを呼び出す.

以上の手順を踏まえてマルチスレッドのプログラムを記載すると,例えば,こんな感じになるだろうか.

public class MyClass extends Thread {
    public void run() {
        for(int i=0;i<10;i++) {
            System.out.println("Good morning, world!");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyClass myclass = new MyClass();
        myclass.start();

        for(int i=0;i<10;i++) {
            System.out.println("Hello, world!");
        }
    }
}

●Runnableインタフェースの実装(implements)を使う方法
[キーワード]
Runnableインタフェース,implements,startメソッド,runメソッド
[手順]
・Runnableインタフェースを実装したクラスを定義(MyClassとする).定義したMyClass内でrunメソッドを記述.
・定義したMyClassのインスタンスを生成し,Threadクラスのコンストラクタに渡す.
・そのインスタンスで,startメソッドを呼び出す.

以上の手順を踏まえてマルチスレッドのプログラムを記載すると,例えば,こんな感じになるだろうか.

public class MyClass implements Runnable {
    public void run() {
        for(int i=0;i<10;i++) {
            System.out.println("Good morning, world!");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        new Thread(new MyClass()).start();

        for(int i=0;i<10;i++) {
            System.out.println("Hello, world!");
        }
    }
}

ThreadクラスのextendsバージョンとRunnableインタフェースのimplementsバージョン,いずれを実行しても,「Hello, world!!」と「Good morning, world!!」が,完全に交互ではないにしろ,10回ずつ表示される.

おわりに

今回のエントリでは,マルチスレッドについて記載した.私自身勉強を始めたばかりなので,これからも継続して勉強をしていきたい.マルチスレッドは,複数の処理を並行して行うことができるテクニックである.マルチスレッドを使えば,例えば,サーバ上で複数のクライアントからのリクエストを並行に処理を行うことができるなどのメリットがあるが,データ破壊やデッドロックなど,シングルスレッドのプログラムでは起こりえなかった不具合が起こる可能性も持っている.そうしたことにならないよう,マルチスレッドを正しく理解していく必要がある.

どうでもいい追記

つい最近,PS Vitaパワプロ2014を買いました.栄光ナインをはじめてやっているけど,結構面白いね.サクセスそっちのけで遊んでます.