multi thread 1

マルチスレッドのお勉強をしていく

読んでいるのはこれ.

dp2cover

Javaでは

java.lang.Thread

を拡張したクラス(Class)を

run

することで,マルチスレッドプログラミングが実現できる.簡単.

ThreadCのサブクラスのインスタンスを使って起動するには

start

としなくてはならない.これは

  1. 新しいスレッドの起動
  2. runの呼び出し

を同時に行うもの.Runnableインターフェース(IF)の実装クラスのインスタンスを使っても良い.(ThreadCはRunnableIFを実装している)

スレッドはsleepで一時停止を行うことができる.この際,InterruptedException例外の処理を記述する必要がある.

また,次のようなケースがあるかもしれない

  • 領域が空いていたらデータを書き込むが,空いていなかったら空くまで「待つ」→wait
  • 領域が空いたので,待っているスレッドに空いたことを「知らせる」→notify,notifyAll

スレッドはwaitを実行すると,一時停止し,wait set(スレッドの待合室)に入る.そして次のどれかが起こるまで待つ

  1. 他のスレッドからnotify,notifyAllによって起こされる
  2. 他のスレッドからinterruptによって起こされる
  3. waitがタイムアウトする

SingleThreadExecutionパターンは,マルチスレッドプログラミングの難しさを浮き彫りにします

  • 一般的に言って,動作テストで安全性を証明することはできない(スレッド侵入のタイミングに依存)
  • デバッグ表示も信用できない(コンソール表示もスレッド侵入のタイミングに依存)

ThreadSafeなコードか,コードレビューが必要.また,SharedResource(共有資源)にアクセスするクラスでは適宜synchronizedを使う.この際,何を守っているかを考える.

unsafeなメソッドでは複数のスレッドから同時に呼び出されては困るので,ガードしなくてはならない(guardedby)

 

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中