[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 12518] Re: Java Concurrency In Practice 第 4 回議 事録
- From: Yasuhiro Endoh <quiver2k@xxxxxxxxx>
- Date: Mon, 23 Oct 2006 00:34:57 +0900
- Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=ybb20050223; d=ybb.ne.jp; b=3P8iHvFQjrICMXvZVOB8cocBGciJHbr7zSeK0ZdLQm4HzOrOxqJq6+tzseYHZVUGRBCqRIUB5yETEOCRXdK7zu6GrYS+gJEeEXEHKk1mjp3Uh/BoF1Zhg/LaeGQPawi7 ;
こんばんは遠藤です。
> 6.1.1 Executing tasks sequentially
> 次のacceptを行わないとリッスン・キューに溜る
> 宿題) リッスンキューが溢れたときはどうなるのか?
サンプルを書いてみました。
private static final int TEST_PORT = 3456;
private static final int BACKLOG = 7;
public static void main(String[] args) throws IOException {
ServerSocket serverScocket =
new ServerSocket(TEST_PORT, BACKLOG);
for(int i = 0; i < 100; i++) {
Socket socket = new Socket("localhost", TEST_PORT);
System.out.println("client (id="+i+") success");
}
}
実行結果は以下の通りです。
client (id=0) success
client (id=1) success
client (id=2) success
client (id=3) success
client (id=4) success
client (id=5) success
client (id=6) success
Exception in thread "main" java.net.ConnectException: Connection
refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at
java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:516)
at java.net.Socket.connect(Socket.java:466)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:179)
at ListenQueueOver.main(ListenQueueOver.java:15)
TAKAHASHI,Toru wrote:
> 「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が入っていればいいじゃないか?
>
>
>
> --
> TAKAHASHI,Toru
> torutk@xxxxxxxxxxxx
>
>
--
// Y. Endoh
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public final class ListenQueueOver
{
private static final int TEST_PORT = 3456;
private static final int BACKLOG = 7;
public static void main(String[] args) throws IOException {
ServerSocket serverScocket =
new ServerSocket(TEST_PORT, BACKLOG);
for(int i = 0; i < 100; i++) {
Socket socket = new Socket("localhost", TEST_PORT);
System.out.println("client (id="+i+") success");
}
}
}