Java 5リリースに入ったjava.util.concurrent
パッケージが出る前は、実際に並行計算を行う以外に、Thread
を直接操作するオプションはありませんでした。
スレッドを直接操作することができます。一般的に、あなたが関心の明確な分離を提供して何かを、サブクラス化する必要はありません主な理由(好ましい方法だったRunnable
を作成することによって、同じことを行うことができ
public class MyThread extends Thread {
public void run() {
myComputation();
}
}
それとも、より良いコードの再利用や:サブクラス化することにより、より良い構成):
どのように使用しても、スレッドを作成、起動、操作、結合する必要がありました。これには欠点があります:いくつのスレッドを作成できますか?これは高価ですか?
また、このAPI自体には、開発者が克服しなければならなかった制限があります。Runnable
から値を返す場合はどうすればよいでしょうか。とにかく署名がそれを許可しないのを見ますか? Runnable
がException
で失敗したかどうかはどうすればわかりますか?例外ハンドラなどのスレッドでそれを可能にするものがありますが、それは静かで繰り返しエラーが発生しやすいタスクでした。
java.util.concurrent
パッケージに入ります!このすべて(そしてもっと)への答えを提供します!
2つ以上の「作業単位」にスレッドを再利用したい場合は(Runnable
かどうか)できます。 「作業単位」が完了したか失敗したかを知りたい場合は可能です。値を返すことができます:できます。他のタスクよりも優先的に動的に優先順位を付けたいですか?確かに。タスクをスケジュールする機能が必要ですか?できる。等々。
はCallable
S(両方を単一のメソッド・インターフェースは、することができ、これは簡単です!)を使用してRunnable
Sを交換し、Future
秒の賛成でThread
の操作を停止し、ExecutorService
に配管を残します。
私の疑問は、CallableがRunnableのすべてを実行できるかどうか、なぜ多くの人が呼び出し可能ではなくRunnableを使用するのですか?
多分古いコード(Java 1.4?)があります。たぶん、彼らはより高いレベルの抽象化の利点を認識しておらず、低いレベルのThread
ものを好むかもしれませんか?
一般に、Thread
を使用することを好む理由はありません。同時のAPIが来たからです。
Runableインターフェイスと比較してCallableインターフェイスを実装する際に余分なオーバーヘッドはありますか?
「Callable
を実装する」では、Runnable
に対しては存在しません。しかし、内部的にはすべてThread
とRunnable
に戻ってくるので、新しいCallable
のものにはコストがかかります(少なくとも、現在の実装ではこれが行われています)。しかし、実際には、スレッドの再利用が容易であるなどの新しい機能があるため、実際にはパフォーマンスが向上する可能性があります。
はい、コンカレントAPIにはコストがありますが、標準的な使用例では完全に無視されますが、パフォーマンスを含めてさまざまな点で優れた新しい機能もあります。
さらに、既に述べたように、APIからは大きな可能性があります(フォーク/結合フレームワーク、Java 8の並列ストリームを参照)。また、 "カスタム"前記機能のための「自己作成型」並行性コードであり、正しく取得することは難しいとされている。
利益/コスト比は、「新しい」並行APIを完全に支持します。
不要な場合は、Callableを使用しないでください。 [KISS原則](https://people.apache.org/~fhanik/kiss.html)に記載されています。 –