デザパタintro
DESCRIPTION
Java言語によるデザインパターン【マルチスレッド編】のイントロダクションです。TRANSCRIPT
Javaで学ぶデザパタ入門 マルチスレッド編
スキルウェンズデー輪読 鈴木雄登
アジェンダ• スレッドとは
• スレッドの起動
• スレッドの一時停止
• スレッドの排他制御
• スレッドの協調
• マルチスレッドの評価
スレッド
• スレッド:複数の処理を同時に実行する場合の、処理の分割の単位として、スレッドとプロセスがある
• スレッドには2種類ある
• シングルスレッド
• マルチスレッド
シングルスレッド
public class Main { public static void main (String[] args) { for (int i = 0; i < 10000; i++ ) { System.out.print(“Good” + i + “!”); } } }
メインスレッド
Good0!Good1!Good2! … Good9999!このようにシーケンシャルに表示される
マルチスレッド
• 複数の処理を同時並行する処理に適している
• 例
• GUIのアプリケーション
• 時間がかかるIO処理
• 複数のクライアントとの処理
Javaでのスレッド
• runとstart
• run
• 新しく起動されるスレッドでの動作
• start
• メインスレッド上で新しいスレッドを呼び出す
実際の流れメインスレッド サブスレッド
start
run
サブスレッド
runstart
サブスレッド
runstart
スレッドの起動
• スレッドの起動については以下の2つの方法がある
• Threadのサブクラスを使う
• Runnableインターフェースの実装クラスを使う
ThreadとRunnableの違い
THREAD RUNNABLE
クラスか否か クラス インターフェース
継承、実装関係 Runnable 親なし
実装方法Thread作って
Runnableて、
Thread
public SampleRunnable implements Runnable { @Override public void run() { … } } !new Thread(new SampleRunnable).start();
public BaseThread extends Thread { @Override public void run() { … } } !new BaseThread().start();
Threadのサブクラス
Runnableの実装クラス
スレッドの一時停止
• sleep
• Threadを止めるメソッド
• これだけ。
スレッドの排他制御• 排他:自分の仲間以外の者すべてをしりぞけて受け入れないこと
• 排他制御:1つの共有資源にアクセスしている期間に複数のスレッドが同時に入ることを防ぐこと
• なんで排他制御?
• 並列で処理→同じものを変更したら壊れる
• 同時に変更は一つまでに制御←排他制御
スレッドの排他制御
• syncronizedメソッド
• メソッドが対象
• syncronizedブロック
• ブロックが対象
syncronizedブロック
class Something { public void method() { synclonized(this) { hoge(); } } }
制御したいインスタンスを引数に加える
このブロック内は 排他制御される
例)
スレッドの協調
• waitメソッド
• 待合室で待つ
• notifyメソッド
• 待合室に空いたことを伝える
マルチスレッドの評価• 安全性(必須)
• オブジェクトを壊さないこと:フィールドが予想外の値を取らないか?
• 生存性(必須)
• 必要な処理が行われること:必要な処理が必ず行われるか?
• 再利用性
• クラスを再利用できること:クラスを再利用できるか?
• パフォーマンス
• 処理を高速・大量にできること
パフォーマンス
• スループット:単位時間あたりの処理数
• 応答性:要求を出してから反応が返るまでの時間
• キャパシティ:同時に処理できる数
• 効率、スケーラビリティ、デグラレーション etc...
問題
public BaseThread extends Thread { @Override public void run() { Sysout(“test”); } } !BaseThread t = new Thread(); t.start(); try { t.sleep(1000); } catch (InterruptException e) { }
1秒間スリープさせたいのですが、 以下のプログラムは誤っています。
どこでしょうか?