通常、スレッドプールを使用します

この記事を読んだ後、あなたは、次の3つのポイントを知っているだろう:

1.プロセス-簡単にスレッド

2.javaスレッドプールが何であるかを、どのような役割どのようなタイプです

3.でスレッドプールを使用することの利点

 
1.プロセス-簡単なスレッド

プロセス

プロセスとは何ですか?

プロセスがイベントで実行されたデータセット上のコンピュータプログラムは、基礎となるオペレーティング・システム・アーキテクチャである、リソース割り当てのためのスケジューリングシステムの基本単位です。簡単に言えば:プロセスは、各プロセスは、独自のアドレス空間を有し、プロセスで実行されるアプリケーションがエンティティです。例えば、我々はプロセスを開始するには、QQをクリックし、私たちは順番にプロセスを開始したブラウザ上でクリックしたときに、プロセスのための別のアドレス空間を割り当てますオペレーティングシステムは、新しいプロセスのためのオペレーティングシステムは、新しい独立を割り当てますアドレス空間。

スレッド

、それのスレッドは何ですか?

スレッドは、プロセスに含まれる予定動作可能なオペレーティング・システムの最小ユニット、ユニットプロセスの実際の動作です。プロセスには、少なくとも1件のスレッドがあります。スレッドは、プロセスシーケンスの単一の制御フローを参照して、プロセスは、並行して、各スレッドは、異なるタスクを実行するために、複数のスレッドによって複雑にすることができます。注意:プロセスを共有するスレッドは、独自のシステムリソースを所有していない、必要不可欠なリソースの操作に少しだけ持っていますが、それは、所定の位置に持ってブロックし、同じプロセスの他のスレッドに属していてもよいが、基本的な3を実行し、すべてのリソース、スレッドを持っています状態。

また:SunOSのUnixのシステムでは、それはまたのような軽量プロセスと呼ばれているが、より軽量プロセスのスレッド、スレッドと呼ばれるユーザスレッドをカーネルを指します。
2.javaスレッドプールが何であるか、どのようなタイプの、どのような役割です

スレッドプールは、タスクキューを追加するプロセスでは、マルチスレッド処理形態で、その後、スレッドの作成後に自動的にこれらの作業を開始し、各スレッドは、優先順位の実行をデフォルトにデフォルトのスタックサイズを使用して、マルチスレッドを課しますユニット、アイドル・スレッドにマネージコード場合、すべての他の補助プロセッサがビジー状態で残るように、スレッドプールのスレッドを挿入します。すべてのスレッドプールは常に忙しくされていますが、キューが作業を保留含まれている場合は、ヘルパースレッドのスレッドプールの数は、時間をかけて最大値を超えることはありません。スレッドは、最大値をキューに入れることができ超えたが、彼らは起動に別のスレッドが終了するまで待たなければなりません。

トップレベルのインタフェース内のJavaのスレッドプールは執行、執行は、スレッドプールではなく、実行ツールの一つのスレッドのみが、実際のスレッドプールがExecutorServiceのです。

スレッドプール内のJavaは何がありますか?

スレッドプールをキャッシュすることができるプロセス作成1.newCachedThreadPool

固定サイズのスレッドプールを作成2.newFixedThreadPoolを

固定サイズのスレッドプールを作成3.newScheduledThreadPool

4.newSingleThreadExecutorシングルスレッドのスレッドプールを作成

:1つの分析以下

1.newCachedThreadPoolを、それがスレッドプールは、より長い処理のニーズを超える場合、リサイクルされていない場合、スレッド、スレッドプールの種類の可変数、及びInteger.MAX_VALUEでは、この数値が大きい、スレッドプールをキャッシュすることができるスレッドの最大数は、柔軟性は、アイドル状態のスレッドを回収しました新しいスレッド。タイムアウト期間が60秒で、アイドルスレッドの60秒以上が回収されるときしかし、プール内のアイドルスレッドは、タイムアウト制限があります。(スレッドが利用可能な場合)以前に構築スレッドを再利用します実行するために呼び出します。あまり時間のかかるタスクの多数の実装に適し、このようなスレッドプール、全スレッドプールは、スレッドプールスレッド意志タイムアウトが停止し、アイドル状態です。

サンプルコード:

    パブリッククラスPoolExecutorTest {
     
        パブリック静的無効メイン(文字列[] args){
            // TODO自動生成方法スタブ
            
            ExecutorServiceのmCachelThreadPool = Executors.newCachedThreadPool()。
            
            以下のために(INT i = 0; iは<7; I ++){
                最終int型のインデックス= I。
                {試す
                    のThread.sleep(2000);
                }キャッチ(InterruptedExceptionある電子){
                    e.printStackTrace();
                }
                mCachelThreadPool.execute(新しいRunnableを(){
                    
                    @Override
                    ます。public void実行(){
                        System.out.println( "第一" +指数+ "スレッド" +にThread.currentThread()のgetName());
                    }
                });
                
            }
            
     
        }
     
    }

出力:

結果から見ることができ、第2のタスクを実行します最初のタスクが完了したとき、スレッドは、最初のタスクは複雑ではなく、すべての新しいスレッドになります実行するために使用されます。

ワーカースレッドの数が達した場合、あなたはワーカースレッドを作成するためのタスクを送信するたびに、スレッドプールねじ山労働者の数を指定して作成したスレッドがアイドル状態にあるとき、スレッドプールが閉鎖されていない限り、彼らは、回復されることはありません2.newFixedThreadPoolタスクの初期スレッド・プールの最大数は、プール(サイズ制限なし)内にキューにサブミットされます。それは外対応する要求のより迅速な端であるようnewFixedThreadPoolためだけコアカーネルスレッドと、これらのスレッドは、回収されません。

コード例:

    パブリッククラスPoolExecutorTest {
     
        公共の静的な無効メイン(文字列[]引数)はInterruptedExceptionある{スロー
            // TODO自動生成されたメソッドスタブ
            スレッド5の最大数を設定//を
            ExecutorServiceのmFixedThreadPool = Executors.newFixedThreadPool(5)。
            
            以下のために(INT i = 0; iは<7; I ++){
                最終int型のインデックス= I。
                mFixedThreadPool.execute(新しいRunnableを(){
                    
                    @Override
                    ます。public void実行(){
                        System.out.printlnは( "时间是:" +のSystem.currentTimeMillis()+ "第" +インデックス+ "个线程" +にThread.currentThread( ).getName());
                        試みる{
                            のThread.sleep(2000);
                        }キャッチ(InterruptedExceptionあるE){
                            e.printStackTrace();
                        }    
                     }
                })。
                
            }
            
     
        }
     
    }

出力:

最大スレッド5ので、その結果2つの実行スレッドの後、2秒間待機した後、スレッド5を実行するとき。

スレッドプールを作成3.newScheduledThreadPool、そのコアは、スレッドの固定数ではなく、スレッドのコアの数が制限されていない、非コアスレッドがアイドル状態のときに即座に回収され、定期的に、または指定した遅延コマンドの後に実行するようにスケジュールすることができます行きました。このようなスレッドプールは、主に一定の周期を有するタスクをスケジュール反復のタスクを実行するために使用されます。

遅延実行例コード:

    パブリッククラスPoolExecutorTest {
     
        公共の静的な無効メイン(文字列[]引数)はInterruptedExceptionある{スロー
            TODO自動の//生成されたメソッドスタブが
            
            コアが2 @プールに配置されている
            ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2)  
            システム.out.println( "今時間:" +のSystem.currentTimeMillis());
            mScheduledThreadPool.schedule(Runnableを新しい新しい(){
                
                @Override
                RUNボイドパブリック(){
                    // TODO自動生成されたスタブメソッド
                    のSystem.out.println( "今時間:" +のSystem.currentTimeMillis());
                    
                }
            }、4、TimeUnit.SECONDSが); //ここに設定された遅延4第二実行
            
     
        }
     
    }

次の実行結果:

エラーは、4秒の結果の実際の遅延を行わない、無視することができます。

定期的に実行するコード例

    パブリッククラスPoolExecutorTest {
     
        公共の静的な無効メイン(文字列[]引数)がInterruptedExceptionある{スロー
            // TODO自動生成されたメソッドスタブ
            
            //コアの数は、プール2内に配置される
            ScheduledExecutorService mScheduledThreadPool = Executors.newScheduledThreadPool(2);  
            システム。 out.printlnを( "今の時間:" +のSystem.currentTimeMillis());
            mScheduledThreadPool.scheduleAtFixedRate(Runnableを新しい新しい(){
                
                @Override
                公共ボイドRUN(){
                    // TODO自動生成されたスタブメソッド
                    のSystem.out.println( "今の時間:" +のSystem.currentTimeMillis());
                    
                }
            }、2、 3、TimeUnit.SECONDS); //ここで設定は2秒の遅延時間後に3秒ごとに実行
            
     
        }
     
    }

次の実行結果:

実際毎に3秒後、2秒によって実行される、プログラムがない出口を実行された見つけることができますダウン。

4.newSingleThreadExecutorこのような内部スレッドプールは、それがすべてのタスクがスレッドで同じ順序であることを保証し、スレッド間でこれらのタスクの同期に対処する必要はありません、問題を作るのスレッドを実行するために無制限のキューにのみ一つのコアスレッドを持っています実行、および任意の時点で複数のスレッドがアクティブな存在することはできません。

サンプルコード:

    パブリッククラスPoolExecutorTest {
     
        公共の静的な無効メイン(文字列[] argsが){例外:InterruptedExceptionをスロー
            // TODO自動生成方法スタブ
            
            ExecutorServiceのmSingleThreadPool = Executors.newSingleThreadExecutor()。     
            以下のために(INT i = 0; iは<7; I ++){
                最終INT番号= I。
                mSingleThreadPool.execute(新しいRunnableを(){
                    
                    @Override
                    ます。public void実行(){
                        System.out.printlnは( "现在的时间:" +のSystem.currentTimeMillis()+ "第" +番号+ "个线程");
                        してみてください{
                            スレッド.sleep(2000);
                        }キャッチ(InterruptedExceptionある電子){
                            e.printStackTrace();
                        }
                        
                    }
                });
                
            }
     
        }
     
    }

次の実行結果:

上記6つのスレッドに順次実行されることが見出されてもよいです。
3.スレッドプール使用する利点

1再利用するスレッドプールのスレッドは、スレッドロックパフォーマンスオーバーヘッドをによって引き起こさ作成および破壊避ける

スレッド間のシステムリソースを大量につかむ回避するスレッドプールの同時2効果的な制御の最大数を障害物

3は、スレッドの簡単な管理を可能にし、そして、いくつかの特定の操作を提供するなど:定期的、定期的に、シングルスレッド、同時制御などの機能を提供する
----------------
著作権を免責事項:この記事はCSDNブロガーである「真クリムゾン騎士のオリジナルの記事、BY-SAの著作権契約、複製、元のソースのリンクと、この文を添付してくださいCC 4.0に従ってください。
オリジナルリンクします。https://blog.csdn.net/qq_33453910/article/details/81413285

おすすめ

転載: www.cnblogs.com/chuang-sharing/p/11653346.html