スレッドを使用するとき、空間的なコンテキストでオブジェクト間の 3 次元以上の相互接続を織り合わせているように視覚化することがあります。これは一般的なユース ケース シナリオではありませんが、私が行っていることについて考えると便利な方法です。
4 に答える
スレッド化を支援するために使用する API はありますか?
から離れているということjava.util.concurrent
ですか?ここから始まるマルチパート チュートリアルで説明されているように、FunctionalJavaには、並行プログラミングを支援するいくつかの構成要素があります。
スレッドがプロセスであると概念化しない方法でスレッドを使用したことがありますか?
はい、スレッドがまったく概念化されていない範囲で。たとえば、非同期タスクランナーを考えてみましょう。カバーの下にスレッドを使用していますが、それらは表示されず、気にしません。それらはタスクランナーによって完全に管理されます。
内部ではすべて単なるスレッドですが、個々のスレッドを気にするのをやめて、コードを入れて一定期間実行できるスロットの数として考えると、それがそのときです。より高いレベルの抽象化に到達し始めます。
エージェント/アクターは、これを行う一般的な方法です。アクターは、状態の塊を持つスレッドのようなもので、コードを送信して、「時間があるときに状態に対してこれを実行してください」などと言うことができます。
初めに
通常の免責事項: 任意の抽象化レベルを使用する任意の言語での並行プログラミングは、困難で複雑であり、多くのリスクがあります。考慮に入れる:
- 並行プログラミングはあらゆるアプリケーションを非常に複雑にします
- クリティカル セクションの単体テストは難しく、不可能な場合もあります
- 並行コードに起因するバグを再現することは非常に難しく、アーキテクチャ、OS のフレーバー、バージョンなどに大きく依存します...
Java 並行 API
Java は、並行プログラミングを開発者にとって可能な限り簡単にするために長い道のりを歩んできました。java.util.concurrent
ほとんどの場合、必要な抽象化のほとんどが含まれていることがわかります。
Runnable
Thread
拡張できるインターフェースとオブジェクト。コードを挿入するだけで、すぐに実行できるスレッドが作成されます- 優れたセット
Executors
: 定数プール、動的プール、スケジュール済みなど。それに投げるだけRunnable
で、残りはそれで済みます。 Semaphore
sおよびあらゆる種類のロックにより、一般的なロック手法を実装する必要がなくなります。- すべてのオブジェクトのビルトイン
wait()
およびAPI。notify()
用途
ソフトウェア エンジニアであるあなたに残された唯一のことは、正しいコードを書いていることを確認することです。つまり、自分がさらされている可能性のある危険な状況に注意する必要があります。
- デッドロック- 2 つ以上のスレッドが順序付けされていないリソースを待機している状況で、無限の待機ループが発生します。
- ライブロック- 2 つ以上のスレッドが、共有リソースで他のスレッドに譲ろうと丁寧に試みますが、最終的には優先されません (廊下で 2 人が互いに近づき、常に左右に一緒に移動しているとします)。
- 飢餓- 単一のスレッドが単一の共有リソースのほとんどまたはすべてを占有し、他のスレッドがそのリソースにアクセスできなくなること。
要点(または、いつ使用するか)
スレッドは、同時実行によってアプリケーションの動作が直接改善される場合にのみ使用してください。
IO/ネットワーク/ハードウェアにバインドされたリソースを待機している場合は、そのリソースでスレッドを生成して、他の作業を続行できるようにします。
CPU バウンドの計算をエレガントに分割しようとしているだけの場合は、スレッドを使用しないでください。パフォーマンスを悪化させるだけかもしれません。
スレッドを使用する場合は、リスクを十分に検討し、例外的な状況を見逃さないように 3 回確認してください。
便利な (オンライン) リソース
物事に取り掛かるための最速の方法は、Sun の同時実行のチュートリアルを行うことです。それ以外は、良い本を入手してください。
幸運を :)
並行性は、深く複雑なトピックです。Java Concurrency in Practiceなどの書籍が役立つ場合があります。
スレッド化に関する APIについては、同時実行ユーティリティの概要を参照してください。たとえば、 BlockingQueue<E>が役立ちます。
要素を取得するときにキューが空でなくなるまで待機し、要素を格納するときにキューでスペースが使用可能になるまで待機する操作を追加でサポートする Queue 。
カウントダウンラッチを参照してください
1 つ以上のスレッドが、他のスレッドで実行されている一連の操作が完了するまで待機できるようにする同期支援。
CyclicBarrierは、いくつかの興味深い動作を示します。
一連のスレッドが互いに共通のバリア ポイントに到達するのをすべて待機できるようにする同期支援。
編集:私は今Java Concurrency in Practiceを読んでいます。これはとてもいいです。
スレッドを使用するとき、空間的なコンテキストでオブジェクト間の 3 次元以上の相互接続を織り合わせているように視覚化することがあります。
複雑に聞こえますが、たとえば 600 スレッドをどのように概念化しますか? それらを明らかに同時に実行されている複数の実行スレッドと考えてみませんか。
スレッド化を支援するために使用する API はありますか?
最も単純でわかりやすいのは、最初に見つけた一致であると思います。http://www.google.co.uk/search?q=java+threads
スレッドがプロセスであると概念化しない方法でスレッドを使用したことがありますか?
スレッドはプロセスではないため、スレッドをプロセスと考えたことはありません。(古いバージョンの Linux を除いて) プロセスは、最初はデフォルトでメモリ/オブジェクトを共有せず、完全に独立して実行されます (通常は異なるプログラムであり、異なる言語で記述されている可能性があります)。また、異なる API を使用して異なる方法で起動します。
マルチスレッドは複雑だという見方もあります。実際、私は反対のことを言うでしょう。マルチスレッド プログラミングでは、コードをシンプルで理解しやすく、簡単に推論できるようにする必要があります。これには経験が必要ですが、目標はシンプルです。