独習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
おおお、バラバラに動いてる!
とりあえず今日はここまで。同期やデッドロックなどはまた次に。