独習Java第9章 マルチスレッドプログラミング(9.1, 9.2)

マルチスレッドの章。スレッドはあまり使ったことないから使いこなせるようがんばるぞー。
環境:UbuntuNetbookRemix10.10 / Oracle(Sun) JDK6 update22

スレッドの状態

新規作成
作成したばかりの状態
使用可能
起動後の状態
実行中
実行された時点からの状態
待機中
待機や入出力をしている状態
破棄
スレッドが完了した状態

優先順位

スレッドには優先順位があり、使用可能状態の優先順位が高いものが実行される。

MAX_PRIORITY > NORM_PRIORITY > MIN_PRIORITY

同じ優先順位のスレッドが複数ある場合、時分割でCPUが平等に実行される。
が、JVMによっては時分割で実行されない場合もあるらしい……

スレッドの作成(Threadクラスを継承する場合)

run()メソッドをオーバーライドし、そのメソッドに処理を記述する。

class ThreadEx extends Thread
{
  public void run()
  {
    // 処理
  }
}

実行する場合はstart()メソッドを呼ぶとスレッドが実行される。

Thread t = new ThreadEx();
t.start();

スレッドの作成(Runnableインターフェースに実装する場合)

引数のないrun()メソッドを定義する。

class RunnableEx implements Runnable
{
  public void run()
  {
    // 処理
  }
}

実行はThreadクラスのコンストラクタにRunnableExのインスタンスを渡し、start()メソッドを呼ぶ。

Thread t = new Thread(new RunnableEx())
t.start();

書いてみる

// Thread継承版
class ThreadEx extends Thread
{
  ThreadEx(int count, long sleepTime)
  {
    this._count = count;
    this._sleepTime = sleepTime;
  }

  public void run()
  {
    try
    {
      for (int i = 0; i < this._count; i++)
      {
        sleep(this._sleepTime);
        System.out.println("ThreadEx: " + i);
      }
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
  }

  private int _count;
  private long _sleepTime;
}

// Runnable実装版
class RunnableEx implements Runnable
{
  public void run()
  {
    try
    {
      for (int i = 0; i < 10; i++)
      {
        Thread.sleep(1000);
        System.out.println("RunnableEx: " + i);
      }
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }
  }
}

class Threads
{
  public static void main(String args[])
  {
    Thread t1 = new ThreadEx(5, 2000);
    Thread t2 = new Thread(new RunnableEx());

    t1.start();
    t2.start();

    try
    {
      t1.join();  // t1が終わるまで待つ
      t2.join();  // t2が終わるまで待つ
    }
    catch (InterruptedException e)
    {
      e.printStackTrace();
    }

    System.out.println("end");
  }
}

実行してみる

$ javac Threads.java
$ java Threads
RunnableEx: 0
ThreadEx: 0
RunnableEx: 1
RunnableEx: 2
ThreadEx: 1
RunnableEx: 3
RunnableEx: 4
ThreadEx: 2
RunnableEx: 5
RunnableEx: 6
ThreadEx: 3
RunnableEx: 7
RunnableEx: 8
ThreadEx: 4
RunnableEx: 9
end

おおお、バラバラに動いてる!


とりあえず今日はここまで。同期やデッドロックなどはまた次に。