0
0

More than 3 years have passed since last update.

並列処理(マルチスレッド)についての備忘録①

Last updated at Posted at 2021-08-13

スレッドとは

  • プログラムを実行した処理の最小単位
  • javaコマンドを実行すると新しいスレッドを作成し、そのスレッド上で指定したクラスのmain()メソッドを実行している

スレッドを作成する方法

Threadクラスを継承してサブクラスを定義

  • run()メソッドをオーバーライド
  • メインメソッド内でstart()メソッドを実行
package cp8.no1;

public class Main {

    public static void main(String[] args) {

        // スレッドの作成
        ThreadA threadA = new ThreadA();
        ThreadB threadB = new ThreadB();

        // スレッドの実行開始
        threadA.start();
        threadB.start();
    }
}

// 1つめのクラス(Threadクラスを継承)
class ThreadA extends Thread {

    @Override
    public void run() {

        for(int i = 0; i < 3; i++) {
            System.out.println(i + "回目:ThreadAを実行");
        }
    }
}

// 2つめのクラス(Threadクラスを継承)
class ThreadB extends Thread {

    @Override
    public void run() {

        for(int i = 0; i < 3; i++) {
            System.out.println(i + "回目:ThreadBを実行");
        }
    }
}

一回目の実行結果

0回目:ThreadAを実行
0回目:ThreadBを実行
1回目:ThreadAを実行
1回目:ThreadBを実行
2回目:ThreadAを実行
2回目:ThreadBを実行

二回目の実行結果

0回目:ThreadAを実行
1回目:ThreadAを実行
2回目:ThreadAを実行
0回目:ThreadBを実行
1回目:ThreadBを実行
2回目:ThreadBを実行

※実行結果が毎回変わる。それぞれのスレッドが独立して動作している為。

Runnableインターフェイスの実装

  • run()メソッドをオーバーライド
  • Runnableインターフェイスを実行したクラスオブジェクトをThreadクラスのコンストラクタの引数にわたす
  • メインメソッド内でstart()メソッドを実行
package cp8.no2;

public class Main {

    public static void main(String[] args) {

        // スレッドの作成
        Thread threadA = new Thread(new ThreadA());
        Thread threadB = new Thread(new ThreadB());

        // スレッドの実行開始
        threadA.start();
        threadB.start();
    }
}

// 1つめのクラス(Runnableインターフェイスを実装)
class ThreadA implements Runnable {

    @Override
    public void run() {

        for(int i = 0; i < 3; i++) {
            System.out.println(i + "回目:ThreadAを実行");
        }
    }
}

// 2つめのクラス(Runnableインターフェイスを実装)
class ThreadB implements Runnable {

    @Override
    public void run() {

        for(int i = 0; i < 3; i++) {
            System.out.println(i + "回目:ThreadBを実行");
        }
    }
}

実行結果

0回目:ThreadAを実行
0回目:ThreadBを実行
1回目:ThreadAを実行
2回目:ThreadAを実行
1回目:ThreadBを実行
2回目:ThreadBを実行

Runnableインターフェイスのrun()メソッドは匿名クラスやラムダ式を用いて実装することも可能

  • Runnableインターフェイスは関数型インターフェイス。抽象メソッドがrun()ただ一つだけ
package cp8.no3;

public class Main {

    public static void main(String[] args) {

        // 匿名クラスを使用
        new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println("匿名クラスの実装");
            }
        }).start();

        // ラムダ式を使用
        new Thread(() -> System.out.println("ラムダ式で実装")).start();
    }
}

実行結果

匿名クラスの実装
ラムダ式で実装

ふりかえり

  • マルチスレッドとはプログラムの実行単位を複数スレッドに分割して実行すること
  • マルチスレッドで実行すると結果が毎回異なる
  • マルチスレッドを実装するには①Threadクラスを継承, ②Runnableインターフェイスを実装する
  • run()メソッドの実装には匿名クラスやラムダ式の使用ができる

その②へ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0