スレッドプールを使用するには、ThreadPoolExecutor

この方法は、我々は継承Threadクラスを通じて達成し、3つの方法で実行可能なインターフェイスまたは呼び出し可能インターフェースを実装します。

Threadクラス、実際に実装継承、Runnableインタフェースは、クラスがrun()メソッドを達成することであるスタートによるメソッド呼び出しを継承しています()。

呼び出し可能インターフェースは、エグゼキュータの一部です。

Runnableをインタフェース機能と比較して差があります。
(1).Callableタスクが戻り値の端部に設けられてもよく、機能が実行可能ではない
(2).Callableコール()メソッドは例外をスローし、Runnableをrun()メソッドは例外ができないスローすることができる
(3)。呼び出し可能な操作は、今後のオブジェクトを取得することができ、排他的な未来は非同期計算の結果を表し、それは計算を確認する方法が完了しています。スレッドは、非同期計算モデルであるため、別のスレッド機能から取得することができないので、
 戻り値、この場合には、ターゲットスレッドの今後の状況を呼び出し()メソッドを呼び出して、GETの呼び出し未来を(置く監視するために使用することができる)方法結果を得るには、現在のスレッドがブロックされ、既知の呼び出し()メソッドは、最終的な結果を返します。

私たちは、最適な効率を達成するために複数のスレッドを使用することができますが、より多くのスレッドが良くありませんが、あまりにも多くのスレッド、創造と破壊がシステムリソースを消費し、また管理が容易になります。

また、マルチスレッド同時実行性の問題も、同時スレッドの過剰な数を引き起こす閉塞を引き起こし、システムリソースをつかむことができます。

   私たちは、スレッドプールのスレッドがあなたが頻繁にスレッドを作成し、破壊しに行くので、システムのリソースを保存しないように、多重バッファスレッドプールのスレッドすることができによって管理されるように、スレッドプールにスレッドします。

プール・スレッドが有効に起因並行性の問題を解決することができるマルチスレッド、同時実行を制御することができるスレッドの数。

 

ThreadPoolExecutor

JavaはThreadPoolExecutorスレッドプールのクラスを提供し、彼はコンストラクタは、4つの異なる主なパラメータを持っています

 

 

 

 

 

カーネルスレッドのスレッドプールの最大数のcorePoolSize

プール内のスレッドの最大数maximumPoolSize

keepAliveTimeがアクティブなスレッドの数は、スレッドのコア数、過剰アイドルスレッドの最大生存時間よりも大きい場合場合

単位の生存時間単位

ワークキューストアスレッド作業キュー

ハンドラ:スレッドの境界およびキューの容量ハンドラタスク(拒否の方針)

 

スレッドの数は、カーネルスレッドの最大数に等しいていた時にすると、スレッドプールにスレッドが、このスレッドは、呼び出し元のスレッドの、待機スレッドのキューに配置されます。

スレッド+内のスレッドのスレッドプール内のスレッドの最大数(スレッドの合計数、maximumPoolSize)=コアの数(corePoolSize)非コア数

コアスレッドが回復を(さえないコアスレッドの仕事であれば)スレッドプールは、非コアスレッドは、その後破棄されます一定時間(keepAliverTime)以上で破棄されることはありません

 

Excutorsツール

ExcutorsがOOM(ヒープメモリオーバーフロー)を引き起こす可能性があるため、Javaは、まだ自分自身のThreadPoolExecutorクラスを作成する必要があるいくつかの大規模なプログラムのために、小規模なプロジェクトについてのためExcutorsツールを提供します

FixedThreadPoolとSingleThreadExecutorは:要求がキュー長Integer.MAX_VALUEで許可され、それによってOOMを引き起こす、多数の要求を蓄積してもよいです。
CachedThreadPoolとScheduledThreadPool:あなたは、Integer.MAX_VALUEでのスレッドの数を作成するためにOOMをその結果、多数のスレッドを作成することができます。
方法 説明
newFixedThreadPool(int型にnthreads) 固定サイズのスレッドプールを作成します。
newSingleThreadExecutor() スレッドプールのスレッドを作成するだけ
newCachedThreadPool() スレッドプールの制限を作成するスレッドの最大数は、任意のタスクが直ちに送信実行されます
newScheduledThreadPool(int型にnthreads) スレッドプール内のスレッドの数を定義した支援タイミングまたは遅延定期的なタスクを作成します。
newSingleThreadScheduledExecutor() サポート定期的に作成し、定期的または単一スレッドプールのスレッドのタスクを遅らせます

 

 

スレッドプールからの結果を取得します。

把线程提交给线程池中,有两种方法,一种是submit,另外一种则是execute

   execute没有返回值,性能会好很多,submit返回一个Future对象,如果想知道线程结果就使用submit提交,而且它能在主线程中通过Future的get方法捕获线程中的异常。

这两种方法的参数必须要实现runnable接口或者是callable对象

 线程池的处理结果、以及处理过程中的异常都被包装到Future中,并在调用Future.get()方法时获取,执行过程中的异常会被包装成ExecutionException。

关闭线程池

可以通过shutdown()或者shutdownNow()方法

shutdown() :   不再接受新的任务,之前提交的任务等执行结束再关闭线程池

shutdownNow() :不再接受新的任务,试图停止池中的任务再关闭线程池,返回所有未处理的线程list列表。

 

Semaphore 的使用方式

Semaphore 是 synchronized 的加强版,作用是控制线程的并发数量。(并发控制信号量)

我们可以在主要执行任务的call()方法或者run()方法中使用semaphore来控制并发。

semaphore的构造方法有两个

 

 第一个构造方法的参数为同一时刻允许线程进入的个数,如果为1,就相当于单个线程。

第二个构造方法的参数为线程公平性isFair

 isFair 的意思就是,是否公平,获得锁的顺序与线程启动顺序有关,就是公平,先启动的线程,先获得锁。isFair 不能100% 保证公平,只能是大概率公平。

 isFair 为 true,则表示公平,先启动的线程先获得锁。

在 semaphore.acquire() 和 semaphore.release()之间的代码,同一时刻只允许制定个数的线程进入, 因为semaphore的构造方法是1,则同一时刻只允许一个线程进入,其他线程只能等待。

acquire:

 

 

おすすめ

転載: www.cnblogs.com/oyjg/p/11951058.html