2012-05-02 16 views
3

マルチスレッドの場合、Java土地で同時実行性のマルチスレッド化については、マルチスレッド化したいコードを「タスク」として分離し、そのタスクを何らかのエグゼキュータサービススレッドプール。 (もしそうなら、何を) Javaの同時実行性とタスク

  • は、タスクがどのオブジェクトのいずれか方法にすることも、特別な何かをする必要もありません:

    私は思ったんだけどありますか?

  • このタスクがCPU、IOバインド、またはその他のタスクであるかどうかをどのように判断しますか? 「死んでの贈り物」やその他の決定要因には何がありますか?

ありがとうございます!

+2

コードがioまたはcpuのいずれであるかを判断する方法は、プロファイラでコードを実行することです。他のものはただ推測していて、通常は間違っています。 – jtahlborn

+0

@jtahlborn - タスクにDNSルックアップが含まれていて、Webサイトからのダウンロードが含まれていると、それがI/Oにバインドされるという手掛かりが得られます。それは推測ではありません;) –

+0

@MartinJames - まだ推測です。同じlan(または実際には小さなファイル)上の別のコンピュータからダウンロードして、結果を狂った計算にすることができます。 – jtahlborn

答えて

2

ExecutorServiceを見てみましょう:

  • submit(Callable)
  • submit(Runnable)

をあなたの仕事は、おそらく(常に他のメソッドを呼び出すことができます)の2つのインタフェースのうちのいずれかでなければなりません。

あなたの仕事は、おそらくあなたは、その中に任意の入力/出力操作を実行する場合はバインドIOです:IE、ソケットへの書き込み、ソケットからの読み取り、ファイルへの書き込み、ファイルを読み込むなど

+0

'ExecutorService'は、タスクの' run() 'または' call() 'メソッド(適用可能なもの)を呼び出して、そのメソッドの定義が何であれ、タスクがバインドされているかを決定します。それは公正な一般化ですか? – IAmYourFaja

+0

@AdamTannonちょうどそれについてまとめています。元の質問に対するjtahlbornのコメントも見てください。 – Jeffrey

0

Threadsは通常、Runnableを実装するクラスで見つけたコードを実行します。

0

タスクはどのオブジェクトのメソッドでもかまいませんか、それとも特別なものでなければなりませんか?

何でもかまいません。大きな問題は、あなたのタスクに他のスレッドと共有されるオブジェクトが含まれている可能性があることです。これらのオブジェクトへのアクセスがスレッドセーフであることを確認する必要があります。それは複雑な話題です。 Goetzらの "Java Concurrency in Practice"は非常に良い本です。