読書会(JAVA CONCURRENCY IN PRACTICE)第4回議事録

[ 戻る ]


「JavaConcurrencyInPracticeを読む会4回」
日時:10月21日 10:00-17:00
場所:中原市民館第3会議室
出席者(敬称略):門脇、村上、根本、岩永、村山、遠藤、岩室、吉本、小松、早川、大石、岡澤、高橋(智)、高橋(徹)

□読書会
○ 5.4 Blocking and interruptible methods
割り込まれたことを知るメソッドは2つある
 interrupted :
 isInterrupted:staticで、割り込み状態をクリアしてしまう

p.93 "cooperative"とはどう訳す
  協調
  割り込み

Restore the interrupted
  interrupt() を呼ぶと、どこかでInterruptedExceptionが発生する
  Propagateする方法と違って、interruptを記録してから処理を継続することもできる

IBM developerWorksの記事「Javaの理論と実践:割り込み例外の処理」2006.5.23

○ 5.5 Synchronizers 

5.5.1 Latches

List 5.11
t.start()は非同期なので、すべてのスレッドがstartGate.await()を呼び出したあとに、startGate.countDown()が呼び出せる保証はない。
  開始を一斉にしたいときにCountDownLatchではむかない(むしろBarrierがよい)のでは

外側のtry-catchで例外が発生すると、endGate.countDown()が呼ばれないので、finally句は外側のtryにも必要では?
そもそも2つのネストしたtryが必要なの?
この例では、thread tがローカル変数で漏洩していないので、割り込みかける人がいないので問題ないのでは

5.5.2 FutureTask

List.5.12
getメソッドは、InterruptedException, ExecutionExceptionのチェック例外の他、CancellationExceptionの実行時例外をスローする

List 5.13
不思議なメソッド

5.5.3 Semaphores


5.5.4 Barrier
CyclicBarrierで、条件が成立したときにbarrier actionを呼び出すスレッドは、最後にawaitしたスレッドとなっている。
awaitの戻り値のインデックスは、awaitに入った逆順(0が最後)。

シミュレーション例、3つ以上の惑星間の動きを計算する。2点間の引力しか算出できないため。

オートマトン
  セルオートマトン
    ライフゲーム
      
○ 5.6 Building an efficient, scalable result cache 
Memoizerの発音?
Perlには標準でMemoizeパッケージがあり、キャッシュ等に使える

putIfAbsentは、Tigerから導入

List5.19 while文は、キャンセル時に処理を継続することを意図したもの
FutureTaskでCancellationExceptionが発生するのは、FutureTaskのcancelを誰かが呼び出したあとでgetを呼び出した場合。このサンプルコードでは、cancelを呼び出せる人が存在しないので発生することはない。

○ 6.1 Executing tasks in threads 
graceful degradationの訳は?

6.1.1 Executing tasks sequentially
次のacceptを行わないとリッスン・キューに溜る
宿題) リッスンキューが溢れたときはどうなるのか?

注1)
マルチスレッド対応なGUIはあるのか?

6.1.2 Explicitly creating threads for tasks
finalは外せないの? → コンパイルエラーとなる

6.1.3 Disadvantages of unbounded thread creation

OSの設定で、スレッド数上限の規定あり
(プロセスあたりのスレッド数)

Linux 2.4だと、スレッド数はID上限で8192に壁あり

宿題)各自自分のマシンで最大スレッド数を調べてみよう

○ 6.2 The Executor framework 
英語で朗読し、訳はなしに議論することで進める
読み手:大石さん、遠藤さん

Executorは、「登録」と「実行」を分離している

Executorは、生産者-消費者設計を実装するのに簡単に使える

exec.execute(task)で上限になるとどうなるのか? → 6.2.2

6.2.2 Execution policies

newSingleThreadExecutorは、newFixedThreadPoolでサイズ1を指定した場合と同じか?
→違いそうである

6.2.4 Executor lifycycle
ExecutorServiceはどうやって取得するのか?
→newXXThreadの戻り値が実はExecutorServiceを実装している。受け取る型をExecutorからExecutorServiceへ変更すればよい。

shutdownNow()の戻り値で返却されるリストは
  まだ実行されていないタスクのリスト
  実行中のタスクは、(通常の実装では)Thread.interruptで割り込みする

6.2.5 Delayed and periodic tasks
Timer: システム時刻が変更(特に逆行)する場合問題が発生する。
  NTPでも大きく時刻がずれると一気に変更することがある

○ 6.3 Finding exploitable parallelism
6.3.1-6.3.3 

6.3.4-6.3.8 

6.3.4 
パイプライン処理みたいなもの。どこかでボトルネックが生じる

6.3.6
completionService.take()は一定回数のforループではないといけないのか
→ takeはブロックメソッドなので、完了したCallableの数以上のtakeをすると、ずっとブロックしたままとなってしまう

リスト6.17
quotesとtasksと2つのリストが一つのfor文のなかで入り乱れているが、必要なコーディングなのか?
  f.get()が主処理
  get()が失敗することがありえる
    デフォルトの画像を表示したい、それを知っているのはtaskしかない
  quoteリストとtaskリストは順番が一致しているのが前提
  ExecutionExceptionに発生元のthisが入っていればいいじゃないか?


[ 戻る ]