マルチスレッド固有

  実際の周波数を使用してマルチスレッド・コードの開発は、大きな助けのコードの効率レベルを改善するためにマルチスレッドで非常に高い流暢です。そこで、本論文では、マルチスレッド一般的な問題のいくつかの理論的知識と実践的なコードを示しています。

  スレッドを作成するには、2つの方法があり、一つは他の一つは、Runnableインタフェースを実現することである、Threadクラスの継承です。2つの違いは次のとおりです。Threadクラスの継承の性質は、複数のスレッドがそれぞれのタスクを完了すると、Runnableインタフェースを実現することにあるタスクを完了するために一緒に複数のスレッドの本質です。どちらの方法に共通しているのは複数のスレッドを作成する必要があり、データベース接続を作成するための基準の概念「データベース接続プールは、」多くの時間を要します。同様に、スレッドが作成され、スレッドは比較的時間のかかる操作で破壊され、そのため、「スレッド・プール」の概念がされて入ってきました。のは、コードを証明してみましょう、最初のコード、複数のスレッドを作成するための直接的な方法は、第二には時間がかかると比べて、スレッドプール、何千回もの同じ蓄積により、複数のスレッドを作成するためのコードです。

輸入java.util.concurrent.atomic.AtomicInteger。

パブリック クラスDEMO1 {
     プライベート 静的 揮発性のAtomicIntegerのAtomicInteger = 新しいのAtomicInteger(0 ); 

    パブリック 静的 ボイドメイン(文字列[]引数){
         長い L = にSystem.currentTimeMillis();
        以下のためにint型 ;;私は1000年<I ++はI = 0 ){ 
            スレッドスレッド = 新しいスレッド(新しいRunnableを(){ 
                @Override 
                公共 無効の実行(){
                    atomicInteger.incrementAndGet()を。 
                } 
            }); 
            Thread.start(); 
            試み{ 
                Thread.join(); // スレッドが待っているブロックされている、またはこのスレッドの同等が別のスレッドに切り替えるには完了していないようにしなければなりません、時間が正確ではありません 
            } キャッチ(InterruptedExceptionあるE){ 
                e.printStackTrace(); 
            } 
        } 
        のSystem.out.println(のSystem.currentTimeMillis() - L)
        のSystem.out.println(のAtomicInteger); 
    } 
}

コードは、時間のかかる操作が453msです。

輸入java.util.concurrent.ExecutorService。
輸入java.util.concurrent.Executors。
輸入java.util.concurrent.TimeUnit。
輸入java.util.concurrent.atomic.AtomicInteger。

パブリック クラスDEMO2 { 

    プライベート 静的 揮発性のAtomicIntegerのAtomicInteger = 新しいのAtomicInteger(0 );
    プライベート 静的 ExecutorServiceのExecutorServiceの= Executors.newFixedThreadPool(10 )。

    パブリック 静的 ボイドメイン(文字列[]引数){
         長い L = にSystem.currentTimeMillis();
        以下のためのint型私= 0; I <1000; 私は++ ){ 
            executorService.execute(新しいRunnableを(){ 
                @Override 
                公共 のボイドの実行(){ 
                    atomicInteger.incrementAndGet(); 
                } 
            }); 
        } 
        executorService.shutdown()。
        試す{ 
            executorService.awaitTermination( 1 、TimeUnit.HOURS)。
        } キャッチ(InterruptedExceptionある電子){ 
            e.printStackTrace(); 
        } 
        のSystem.out.println(のSystem.currentTimeMillis() - L)。
        System.out.println(のAtomicInteger)。
    } 
}

二時間のかかる実行中のコードは22msです。比較を消費することによって、我々はなく、すべてのスレッドがスレッドや破壊、検証の前に認知理論を作成するため大幅に、実行時間を短縮することができ、スレッドプールを使用し、見つけることができます。

 

ExecutorServiceの概要

  ExecutorServiceのライフサイクルが実行された、クローズを強制的にshutdownNowのメソッドを呼び出して、閉じて滑らかにするために、それが作成された後に実行されている3つの状態が、終了shutdownメソッドを呼び出すために閉鎖し、2つの方法の違いは、シャットダウン後、もはや許容されませんそれが閉じて前に新しいタスクが、現在のタスクが終了します。shutdownNowの方法にかかわらずキューに登録されていないタスクが実行されるのを待った後、終了するように強制されます。実際のプロジェクトの開発では、我々は多くの場合、シャットダウンを終了させる方法を使用します。さらに、長い防ぐために、直ちにそれによって、同期効果を生成し、待っているawaitTerminationメソッドをブロックと呼ばれる、通常のシャットダウンメソッドの呼び出しの後、時間を待っています。

 

エグゼキューについて

  エグゼキュータは、ソースコードを参照してください、私たちは、あなたがスレッドプールのさまざまなを作成することができ、多くの内部の静的メソッドがあることがわかります。そのため、実際のコードの開発では、我々は多くの場合、スレッドプールを作成するために、staticファクトリメソッドのエグゼキューを使用し、4つの一般的なスレッドプールがあります。

  1. 最大数は、スレッドプールのサイズが変更されない場合名は、スレッドのパラメータの最大数を作成するために、示唆するように、固定長のスレッドプール - newFixedThreadPool(キューをブロックベース鎖LinkedBlockingQueueキューを使用して)。
  2. newCachedThreadPool(SynchronousQueue同期キューを使用する)は、スレッドプール、作成するための柔軟性、柔軟性の回復をキャッシュすることができます。
  3. (DelayedWorkQueue遅延キューを使用して)newScheduledThreadPoolはクォーツやタイマーなどの定期的かつ定期的なタスクを、サポートしています。
  4. (LinkedBlockingQueueキュー用い - キューをブロックベースチェーン)newSingleThreadExecutorシングルスレッドのスレッドプール、それが唯一のタスクを実行するスレッドが作成され、タスクは、等FIFO、優先順位など、指定された順序で実行することができます

 

おすすめ

転載: www.cnblogs.com/Demrystv/p/11514847.html