2008年10月18日土曜日

Thread thread = new Thread(Runnable command);

Thread.start(thread);

っていつの間にか使わなくなってた罠。
Java5から付いていけてないという、確たる証拠を晒してしまった系。
ExecutorServiceって..."サービス"って名前は良くないよなぁ。
サービス恐怖症になりつつある俺。

java.util.concurrent.*の訳が従来どおりというか、よりイケてないせいで余計わからなくなった。
いつものとおり?J2SE5.0 虎の穴にて確認しながら気になった部分とか感想を列挙しますー。
まぁ覚書ていどに。
  • Executorインタフェース...Threadの生成を隠蔽するのがキモ。Executor#execute(Runnable command)を実装する人は、その処理を非同期にしたい場合はやっぱりnew Threadする必要がある。
  • Executorの実装内部でRunnableの実行に関してQueueを使って順序を守ったりとか、そういうことが想定されているもよう(javadocに例あり)。
  • Executorsクラス...ユーティリティなので要チェック。
    • #newCachedThreadPool()...いろいろとうまいこと勝手にやってくれるらしい。つまりあやしい。60秒利用されなかったスレッドは削除されますよ。
    • #newFixedThreadPool(int nThreads)...スレッドの数が決まってる。
    • #newSingleThreadExecutor()...単発ワーカスレッドだけどnewFixedThreadPool(1)とは違うらしい。
  • ExecutorServiceインタフェース...スレッドプール用のインタフェース。Executorsで生成できるスレッドプールの実装クラスを受け取るのに利用できるのと、後述のCallableを実行状態にできる&戻り値の受け取りができるのはこの人。
  • ThreadPoolExecutorクラス...設定がいろいろできるExecutor。でもExecutorsからもらえる汎用的なもののほうがあれこれ調整しなくてもフツーに使える。スレッドプールの実装を以前からゴリゴリやってる人にはなじみやすいのかも。
  • ScheduledThreadPoolExecutorクラス...遅延タスク、周期実行用。FIFOらしい。遅延はいつものごとく「実行するよフラグ」が立つだけでいつ実行されるかは保証できない(仕様としてはしなくてよい、が正解かな)らしい。
  • Callableインタフェース...戻り値を返すcallメソッドが定義されている。Runnable#runが戻り値を持ったわけだが、実行はExecutorServiceを通す必要がある。
基本的なところはこんな感じ。あとはキューとかラッチとかスレッド間同期用クラスとか。
カッコいい名前のCyclicBarrierなんてものも。バリアて。小学生以来ですよ、ええ。

そうそう、なんでパラレル処理を見てるかというと。
馬鹿デカいログファイルを細切れにパラで処理したら速いだろうかと思ったわけです。
でももうちょっと面白い使いかたができそうなので、思い付いたらまた書こうと思います。

0 件のコメント: