有一个循环轮询从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读取父计数器。

最佳答案

计数器不是线程安全的。使用AtomicInteger并使它可用于可运行代码块和第一个代码块。

07-24 15:40