2

GenericObjectPoolからオブジェクトを借用するためにポーリングするループがあります。プール自体のサイズは1です。以下のコード-

final CompletionService completionService = new ExecutorCompletionService(getExecutorServices());               
int counter = 0;

    for (Iterator iter = AList.iterator(); iter.hasNext();) {

                borrowed = this.getPool().borrowObject();

                if (borrowed == null) {
                    throw new Exception("not set");
                } else {        
                    completionService.submit(borrowed,borrowed);
                    counter ++;
                }   
    }   

プールのサイズは1であるため、最初の借用後、プールは使い果たされてブロックされます。オブジェクトをプールに戻すには、次のように別のスレッドを実行すると思います-

new Runnable() {

    public void run() {
        for (int i = 0; i < counter; i++) {

            borrowed = completionService.take().get();
            status = borrowed.getStatus();

            getPool().returnObject(borrowed);
                        counter --;

            if (status = 1) {
                getExecutorServices().shutdownNow();
                return;
            }
        }
    }

};

これは、各スレッドの完了に基づいて動作し、スレッドを解放して借用できるようにするためのCompletionServiceへのブロッキング呼び出しです。

ただし、この設計には、親のカウンターがRunnableから読み取れないなどの欠点があります。

4

2 に答える 2

0

カウンターはスレッドセーフではありません。AtomicIntegerを使用して、実行可能コードブロックと最初のコードブロックの両方で使用できるようにします。

于 2013-02-21T12:36:56.193 に答える
0

スレッドを監視するためにRunnableから値を返すCallableDecoratorを作成し、それを修正しました。

于 2013-03-19T17:17:44.030 に答える