デザパタintro

18
Java で学ぶデザパタ入門 マルチスレッド編 スキルウェンズデー輪読 鈴木雄登

Upload: yuto-suzuki

Post on 05-Jul-2015

152 views

Category:

Technology


2 download

DESCRIPTION

Java言語によるデザインパターン【マルチスレッド編】のイントロダクションです。

TRANSCRIPT

Page 1: デザパタIntro

Javaで学ぶデザパタ入門 マルチスレッド編

スキルウェンズデー輪読 鈴木雄登

Page 2: デザパタIntro

アジェンダ• スレッドとは

• スレッドの起動

• スレッドの一時停止

• スレッドの排他制御

• スレッドの協調

• マルチスレッドの評価

Page 3: デザパタIntro

スレッド

• スレッド:複数の処理を同時に実行する場合の、処理の分割の単位として、スレッドとプロセスがある

• スレッドには2種類ある

• シングルスレッド

• マルチスレッド

Page 4: デザパタIntro

シングルスレッド

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!このようにシーケンシャルに表示される

Page 5: デザパタIntro

マルチスレッド

• 複数の処理を同時並行する処理に適している

• 例

• GUIのアプリケーション

• 時間がかかるIO処理

• 複数のクライアントとの処理

Page 6: デザパタIntro

Javaでのスレッド

• runとstart

• run

• 新しく起動されるスレッドでの動作

• start

• メインスレッド上で新しいスレッドを呼び出す

Page 7: デザパタIntro

実際の流れメインスレッド サブスレッド

start

run

サブスレッド

runstart

サブスレッド

runstart

Page 8: デザパタIntro

スレッドの起動

• スレッドの起動については以下の2つの方法がある

• Threadのサブクラスを使う

• Runnableインターフェースの実装クラスを使う

Page 9: デザパタIntro

ThreadとRunnableの違い

THREAD RUNNABLE

クラスか否か クラス インターフェース

継承、実装関係 Runnable 親なし

実装方法Thread作って

Runnableて、

Thread

Page 10: デザパタIntro

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の実装クラス

Page 11: デザパタIntro

スレッドの一時停止

• sleep

• Threadを止めるメソッド

• これだけ。

Page 12: デザパタIntro

スレッドの排他制御• 排他:自分の仲間以外の者すべてをしりぞけて受け入れないこと

• 排他制御:1つの共有資源にアクセスしている期間に複数のスレッドが同時に入ることを防ぐこと

• なんで排他制御?

• 並列で処理→同じものを変更したら壊れる

• 同時に変更は一つまでに制御←排他制御

Page 13: デザパタIntro

スレッドの排他制御

• syncronizedメソッド

• メソッドが対象

• syncronizedブロック

• ブロックが対象

Page 14: デザパタIntro

syncronizedブロック

class Something { public void method() { synclonized(this) {        hoge(); } } }

制御したいインスタンスを引数に加える

このブロック内は 排他制御される

例)

Page 15: デザパタIntro

スレッドの協調

• waitメソッド

• 待合室で待つ

• notifyメソッド

• 待合室に空いたことを伝える

Page 16: デザパタIntro

マルチスレッドの評価• 安全性(必須)

• オブジェクトを壊さないこと:フィールドが予想外の値を取らないか?

• 生存性(必須)

• 必要な処理が行われること:必要な処理が必ず行われるか?

• 再利用性

• クラスを再利用できること:クラスを再利用できるか?

• パフォーマンス

• 処理を高速・大量にできること

Page 17: デザパタIntro

パフォーマンス

• スループット:単位時間あたりの処理数

• 応答性:要求を出してから反応が返るまでの時間

• キャパシティ:同時に処理できる数

• 効率、スケーラビリティ、デグラレーション etc...

Page 18: デザパタIntro

問題

public BaseThread extends Thread { @Override public void run() { Sysout(“test”); } } !BaseThread t = new Thread(); t.start(); try { t.sleep(1000); } catch (InterruptException e) { }

1秒間スリープさせたいのですが、 以下のプログラムは誤っています。

どこでしょうか?