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