Java内部の何かを探るUtilコンカレントパッケージ(第1回)



ちょうどあなたが日々のプログラミングタスクのために必要なもの
ジャバ.UtilJavaでの同時実行パッケージには、同時プログラミングを可能にするインターフェイスとクラスが含まれます.
並列プログラミングとは何か

並行性
プログラムでは、1つ以上のプロセスが同時に実行されているように見えます.なぜ表示され、本当の?つのプロセスが実際に同時に実行されている場合は、並列性があります.
並行処理の概念にはあまり興味を持ちませんが、並行してJavaのパッケージ内のコンテンツを探索することはできません.

NB: It will not be possible to cover all that’s mentioned in the content segment in a single article, so I will cover them all in multiple parts (hopefully two would be enough).



内容
Java .Util並行
執行者と未来
同時コレクションJava .Util並行.ロックJava .Util並行.原子
ジャバ.Util並行
このパッケージに含まれる主要なコンポーネントは — 実行者、キュー、タイミング、同期、および同時コレクション.
この記事では、Webベースのアプリケーションで使用されている2つのコンポーネントを探索します — 実行者と同時コレクション.
Executorフレームワークの階層と一緒のクラスとインターフェイスは以下のイメージに示されます.
執行者

Javaのインターフェイスとクラス階層.Util同時パッケージ
threadPoolExecutorとScheduledThreadPoolExecutorクラスの違いは、遅延を追加するようなタスク実行をスケジュールするために後者を使用できることです.
もう一つの重要なクラスの1つは、このパッケージで覚えておく必要が執行者です.このクラスは、実行中の作業中に必要な構成のほとんどのファクトリメソッドを提供します.
これらのクラスを使用するか、インターフェイスを実装し、独自の実装を行うことができます.
インターフェイスを使用して、スレッドプールを作成し、そのプールからスレッドをフェッチしていくつかのタスクを実行します.Executor Factoryクラスからメソッドを使用してスレッドプールを作成します.
< div >
上記のサンプルでは、2の初期サイズを持つthreadpoolを作成しました.また、オプションのThreadFactoryの独自の実装を提供しました.我々自身の実装をスキップすることができます、そして、実行者はデフォルトThreadFactory実装をします.我々自身の工場を実装している理由は、新しいスレッドに名前を与え、どのスレッドがタスクを実行しているかを識別することですp >
次に、executorserviceのSubmit ()メソッドを使用して3つのタスクを実行しました.注意してください、それらのすべての3つの別の署名があります.callableやrunnableのタスクを使用してタスクを提出することができます.p >
上記コードの出力は以下の通りです.
<> P >
クラスをハイライト表示する
Implemented Runnable Interface1

Implemented Runnable Interface2

Implemented Callable Interface2
< div >
最初のタスクはスレッド1で実行され、次の2つはスレッド2で実行されました.p >
< p >< em >将来、実行可能であり、呼び出し可能である
ラン可能で呼び出し可能な同様のジョブを実行します.両方とも新しいスレッドでタスクを実行しますが、Callable can return a resultはチェックされた例外をスローできます.p >
未来は署名インターフェイスの将来のインタフェースです.非同期実行の結果を表します.上記のコード例では、ExecutorのSubmitメソッドが将来を返します.p >
並行したパッケージの多くのクラスはこのインターフェースを実装します.将来のインターフェースの最も一般的に使用される実装の1つを見てみましょう — 完了しました.p >
以下のシグネチャを表示します
<> P >
クラスをハイライト表示する
public class CompletableFuture<T>
extends Object
implements Future<T>, CompletionStage<T>
< div >
このクラスに属するメソッドのいくつかをチェックしましょう.p >
< OL >
  • runasync ():新しい完全な未来を返します.実行可能なオブジェクトを取得します.コードブロックを実行し、戻り値を期待しない場合は、このメソッドを使用します.
  • SupplyAsync () :新しい完了時の返り値指定されたサプライヤーを呼び出すことによって得られた値を返します.コードブロックを実行し、戻り値を期待する場合は、このメソッドを使用します.
  • < OL >
    これらのメソッドの両方には、Executorインスタンスをパラメーターとして受け入れるオプションがあります.これらのメソッドにexecutorを供給しない場合、ForkJoinPoolを使用して新しいスレッドが作成されます.準拠p >
    <高橋潤子>**この項目の翻訳は古いバージョンが元になっています**p >
    < div class ="LagagCount - gig - Link - tag "
    "スクリプトのID "https://gist.github.com/rubykv/c6c582f1e237c73003c95862294377ea.js//>
    < div >
    < OL >
  • < p > thenaccept (): Completedfutureタスクの結果を取得し、消費者オブジェクトへの引数として渡します.将来のオブジェクトの結果に基づいてタスクを実行し、そのタスクから結果を返したくない場合は、このメソッドを使用します.p>
  • < p > thenapply () : Completedfutureタスクの結果を取得し、関数オブジェクトへの引数として渡します.将来のオブジェクトの結果に基づいてタスクを実行し、そのタスクから結果を返す必要がある場合は、このメソッドを使用します.p>
  • < OL >
    < div class ="LagagCount - gig - Link - tag "
    "スクリプトのID "https://gist.github.com/rubykv/747fb2895e38e60b12de3c09d76db056.js//>
    < div >
    < OL >
  • TenCompose ():将来の2つの実行の結果を結合する場合、将来のタスクが別の将来のタスクの出力に依存した場合、このメソッドを使用します.
  • < OL >
    < div class ="LagagCount - gig - Link - tag "
    "スクリプトのID "https://gist.github.com/rubykv/dc12c64761fb96540b05ae9de4896b3d.js//>
    < div >
    < OL >
  • TenCombine () : 2つの独立した将来のタスクの出力を結合したい場合、このメソッドを使用します.
  • < OL >
    < p >上記のコードを変更して以下の変更を行います.p >
    < div class ="LagagCount - gig - Link - tag "
    "スクリプトのID "https://gist.github.com/rubykv/2b58e956eb9d9e1af0ca9995013328d5.js//>
    < div >
    コンカレントコレクション


    マルチスレッドコンテキスト用に設計されたコレクション実装は< p/p >です
    < p > concurrentashmap , concurrentski plimap , concurrentskiplistset , CopyOnWriteRayList , CopyOnWriteRaySet


    これらのクラスの動作は同期クラスとは異なることに注意してください.p >
    例えば、コレクション.SynchronizedList ( new Arraylist ();同期されたArrayListを返します.Synchronized Collectionのスレッドセーフは、オブジェクト全体にスレッドロックを適用することで実現されます.p >
    CopyOnWriteRayList ,同期されたリストの同時の代替手段は、複数のスレッドをコレクションから読み込み、インスタンスにロックを適用することなく読み込むことでスレッドセーフを実現します.p >
    同時性のコレクションは、より良いパフォーマンスとスケーラビリティのために同期したコレクションの上で好まれますp >
    次の記事の他の2つのサブパッケージを調べます.< em > < em >
    < hr/>