スレッドプールの原理とスレッドプールを実現するクラスExecutorServiceにおけるメソッドの使用

2265 ワード

1.スレッドプール:スレッドプールはコンテナのようなもので、このコンテナはスレッドを格納するために使用され、固定容量があります.
スレッドプールがない場合、タスクを実行するためにスレッドが必要な場合はスレッドを作成する必要があります.スレッドを作成する時間をt 1、スレッドを実行する時間をt 2、スレッドを破棄する時間をt 3とします.スレッドの作成からスレッド破棄までの時間がt 1+t 2+t 3であり、スレッドプール技術は、サーバプログラムの起動と終了の時間帯または空き時間帯にt 1とt 3の時間の操作をスケジュールし、スレッドプールには常に容量サイズのスレッドが存在し、スレッドを使用する必要がある場合にスレッドプールから呼び出すので、リソースを大幅に節約し、効率を向上させることができます.
       :
http://blog.csdn.net/hsuxu/article/details/8985931

2.ExecutorService
ExecutorService service= Executors.newFixedThreadPool(100);メソッド:execute(Runnable)は、Runnableオブジェクトをパラメータとして受信し、非同期で実行しますが、実行後の結果は返されません.
submit(Runnable)は同じようにrunnableオブジェクトをパラメータとして受信しますが、Futureオブジェクトが返されます.このFutureオブジェクトは、Runnableが実行を終了するかどうかを判断するために使用できます.
拡張
futureオブジェクトの使用と役割:簡単に言えば、あるスレッドAの実行結果が必要である場合(つまり、次の操作を行うにはAというスレッドが実行されなければならない)次の操作を継続するには、一般的なrunnableメソッドはjoinメソッドを呼び出してメインスレッドBをブロックしてスレッドAの実行が完了するのを待つしかありません.これにより、時間の浪費がマルチスレッドの優位性を体現することができません.futureを使用すると、スレッドAを実行するときに他のAを必要としない接合を同時に非同期で実行できます.実のスレッドは、常にスレッドAの実行状態に戻り、Aが実行済みかどうかを見ることができる.
例:
もしあなたが急に料理をしたいなら、調理器具も食材もありません.ネットで調理器具を購入するのは便利で、食材はスーパーで買ったほうが安心です.実现分析:速达员が食器を送っている间、私たちはきっと暇ではありません.スーパーに行って食材を买うことができます.だから、メインスレッドの中にもう一つのサブスレッドがネットで調理器具を買いに行きます.私たちが料理をするには、調理器具と食材がそろっていなければ始められません.調理器具を買うのが最も時間のかかる一環であれば、joinメソッドを呼び出さずに調理器具を買うスレッドが実行されるのを待つと、調理器具がまだ買えていないのに料理を始める間違いが発生します.runnableメソッドを使うと、私たちは調理器具を買うスレッドが実行されるのを待つしかありません.フューチャーを使った対象は、調理器具を購入しながら食材を購入することができます
                  :https://www.cnblogs.com/cz123/p/7693064.html

Callableオブジェクト:
submit(Callable)とメソッドsubmit(Runnable)は似ていますが、違いは異なるパラメータタイプを受信することです.CallableのインスタンスはRunnableのインスタンスと似ていますが、Callableのcall()メソッドは結果を返すことができます.方法run()は結果を返すことができません.Callableの戻り値は、メソッドsubmit(Callable)が返すFutureオブジェクトから取得できます.
invokeAny(...)  
invokeAll(...)  
スレッドプールのクローズ方法:
shutdown():スレッドプールはすぐに終了するのではなく、すべてのタスクキャッシュキューのタスクが実行されてから終了しますが、新しいタスクは受け入れられません.
shutdownNow():スレッドプールを直ちに終了し、実行中のタスクを中断し、タスクキャッシュキューを空にして、まだ実行されていないタスクを返します.
isTerminatedメソッド:すべてのサブスレッドがすべて実行済みかどうかを判断して閉じ、すべて実行済みであればtrueを返します.注意shutdownまたはshutdown Nowを最初に呼び出さない限り、isTerminatedはtrueではありません.
閉じた後にすべてのタスクが完了したらtrueを返します.
    :http://blog.csdn.net/bairrfhoinn/article/details/16848785