カテゴリー別アーカイブ: マルチスレッド

Java CASによるアトミック演算

CAS (Compare And Swap) を利用することで, 比較処理と代入処理をアトミックに実行する (= 他のスレッドに割り込まれない) ことが可能になります. さらに, マルチスレッドにおける排他制御の手法 (synchronizedやLock) よりも, ロックをしないので高速な処理が可能です.

JavaでCASを実行するには, Atomic***のクラスを利用します.

AtomicIntegerで整数のインクリメントをアトミックにする例です.

Java スレッド生成

Javaでスレッドを生成するには, Threadクラスのインスタンスを生成して, startメソッドを実行する.

Thread thread = new Thread();

startメソッドで実行を開始して, joinメソッドでスレッドが終了するのを待機する.

thread.start();

//別のスレッドで何かする

thread.join();

で, 問題は何かする部分の実装の方法です.

これには2つの方法があります.

  • Threadクラスを継承したサブクラスでrunメソッドをオーバーライドする
  • Runnableインターフェースを実装したクラスでrunメソッドをオーバーライドする.

Threadクラスを継承する場合,

class MyThread extends Thread {
    public MyThread() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
        }

       System.out.println("End thread");
    }
}

Threadクラスのサブクラスを生成した場合は, コンストラクタ呼び出しでも, サブクラスを利用する.

Thread thread = new MyThread();

Runnableインターフェースを実装する場合,

class MyThread implements Runnable {
    public MyThread() {
    }

    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
        }

       System.out.println("End thread");
    }
}

Runnableインターフェースを実装した場合は, Threadコンストラクタの引数に, Runnableインターフェースを実装したクラスのインスタンスを指定する.

Thread thread = new Thread(new MyThread());