这一系列主要说的是org.apache.commons.pool2包提供的ObjectPool以及对应的实现源码。
1.已有连接池举例
目前已知的对象池的应用,比如:
数据库连接池——org.apache.commons.dbcp2的BasicDataSource
jedis连接池——redis.clients.jedis的JedisPool。
2.线程池
线程池的用法和这个不太一样,因为线程的run方法执行完之后,一个线程的使命就结束了。所以如果要想重用线程,就需要阻止run方法的结束,用死循环等方法。目前jdk线程池使用的是结合LinkedBlockingQueue,通过队列的阻塞方法让当前线程休眠,等待任务并处理,实现单个线程的重用。
execute方法会添加一个worker。
public void execute(Runnable command) {
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
...
}
private boolean addWorker(Runnable firstTask, boolean core) {
...
Worker w = new Worker(firstTask);
Thread t = w.thread;
...
try {
...
workers.add(w);
...
} finally {
mainLock.unlock();
}