意味
オブジェクトプールは、初期化され、使用可能なオブジェクトのコレクションです。プールのユーザーは、プールからオブジェクトを取得し、操作し、そうでない場合は破壊する代わりにプールに戻すことができます。
初期化とインスタンス化が高価であり、頻繁にインスタンス化する必要があるが、インスタンスの数は一度に少ない場合、オブジェクトプールを使用してパフォーマンスの大幅な改善を実現できます。プールからオブジェクトを取得する時間は予測可能ですが、新しいインスタンスを作成するのにかかる時間は不確かです。
成し遂げる
1。再利用可能 - オブジェクトプール内のオブジェクト、通常、インスタンスのコストは比較的高くなります。
2。クライアント - オブジェクトのインスタンスを使用します。
3。ReusablePool-オブジェクトのインスタンス、リサイクル、破壊を管理します。
単一のインスタンスの主なアイデア
1.スタック、ここにスタックがあります
2。初期化方法、容器が開いたときにプールを事前に作成できます。
3。インスタンスを作成する方法
4.プールからオブジェクトインスタンスを取得する方法を提供する
5.返品方法を提供しますが、結果は深刻です。
6.リクエスト待機時間を制御する方法。特定のイベントが通過した後、ヌルポインターが返されます。
java.util.stackをインポートします。 @suppresswarnings( "unchecked")public class objectpool {public objectpool(){} prival poolamparam poolparam; public void setPolparam(poolparam poolparam){this.poolparam = poolparam; } //現在のオブジェクトの総数private int currentnum = 0;プライベートクラスのクラズ; public void setclazz(class clazz){this.clazz = clazz; } //スタックは、オブジェクトを保存し、プールのプライベートスタックスタックをシミュレートするために使用されます。 public Stack getStack(){return stack; } public void setStack(stack stack){this.stack = stack; } // ....................................................................... //タイムアウトがプライベートint timewait = 0を期限切れにするのを待つ。 // ............................................................................... //オブジェクトプールの作成public void initialpporam(Poolparam poolparam、class clazz){this.setpolparam(poolparam); this.setclazz(clazz); stack = new stack(); stack.clear(); // system.out.println( "obj..pool is initial ..."); //スタックに設定してプッシュするオブジェクトの最小数を生成します{for(int i = 0; i <poolparam.getminobjectcount(); i ++){// poolparam stack.push(clazz.newinstance())に従ってオブジェクトプールを初期化します; }} catch(instantiationexception e){e.printstacktrace(); } catch(Illegalaccessexception e){e.printstacktrace(); }} //単一オブジェクトを作成するプライベートオブジェクトCreateOBJ(class clazz){object obj = null; try {obj = clazz.newinstance(); // system.out.println( "a new One ..."); } catch(instantiationexception e){e.printstacktrace(); } catch(Illegalaccessexception e){e.printstacktrace(); } objを返します。 } //オブジェクトプールで提供されたメソッドを取得public object getInstance(){// System.out.println(stack.size());オブジェクトオブジェクト= null; if(stack.size()== 0){//現在のスタックの長さが0であり、オブジェクトの総数が最大定義数を超えない場合((currentnum + poolam.getMinobjectCount())<Poolam.getMaxObjectCount(){//新しいオブジェクトを作成します。 //オブジェクトの数+1 CurrentNum ++; } else {synchronized(this){try {waitme(this); } catch(Exception e){e.printstacktrace(); } //通知を取得した後、スタックが空であることを確認し、リリースをリリースしたif(!stack.empty()){object = stack.pop(); }}}} else if(stack.size()> 0){object = stack.pop(); // system.out.println(stack.size()); }オブジェクトを返します。 } //オブジェクトを返す方法public void returnobj(object obj){if(clazz.isinstance(obj)){stack.push(obj);同期(this){notify(); }} else {system.out.println( "このオブジェクトはスタックにプッシュできません!"); }} //再帰アルゴリズムを待機プライベートボイドウェイトマ(ObjectPoolプール){// 2Sの技術的制御を待ちます(TimeWait> = 2000){System.out.Println( "Jump Up This Step .."); TimeWait = 0;戻る; } else {try {pool.wait(500); //カウントが蓄積するのを待ちます。 。 TimeWait += 1000; system.out.println( "objを解放するための待ち時間"); if(stack.empty()){system.out.println( "agian ...."); WATEME(プール); }} catch(arturnedexception e){e.printstacktrace(); }}}}
プールのクラスを管理してください、これはそれほど難しくありません、それを同期するのは良いことです
@suppresswarnings( "unchecked")public class objectpoolmanage {private objectpoolmanage(){} private static objectpoolプール; // Singletonの取得方法を実装...デフォルトのpublic static同期Pool getCacheObject(class clazz){if(null!= pool){return pool; } else {create objectpool(null、clazz);プールを返す; }} //シングルトンの取得方法を実装...カスタムpublic static同期objectpool getCacheObject(poolparam P、class clazz){if(null!= pool){return pool; } else {create objectpool(p、clazz);プールを返す; }} private static objectpool create objectpool(poolparam P、class clazz){pool = new objectPool(); if(null == p){pool.initalpool(new poolparam(5,10)、clazz); } else {pool.initalpool(p、clazz); }プールを返します。 } private static class getclazz(){class clazz = null; try {clazz = class.forname(ppp.getPropertybyname( "objectPath")); } catch(classNotFoundException e){e.printstacktrace(); } clazzを返します。 }}
関連する質問と実装
1.オブジェクトの数は、オブジェクトプールで制限できます。制限が制限を超えた場合、オブジェクトプールは顧客に通知するために例外またはヌル値を返す必要があります。
2。マルチスレッド環境では、チェックアウトとチェックインメソッドを同期する必要があります。
3.期限切れのオブジェクトを定期的にクリーンアウトします。