兩步完成對象池構建:
public class ObjectFactory extends BasePooledObjectFactory<ObjectFactory.Computer> {
@Override
public Computer create() throws Exception {
return new Computer("mac"); // 返回需要池化的對象實例
}
@Override
public PooledObject<Computer> wrap(Computer obj) {
return new DefaultPooledObject<>(obj); // 包裝為池化對象
}
public static class Computer { String name; public Computer(String n){ this.name=n; } }
}
ObjectFactory factory = new ObjectFactory();
ObjectPool<ObjectFactory.Computer> pool = new GenericObjectPool<>(factory);
// 線程 1 借用並歸還
new Thread(() -> {
try {
Computer c = pool.borrowObject();
System.out.println(Thread.currentThread().getId() + ":" + c);
pool.returnObject(c);
} catch (Exception e) { e.printStackTrace(); }
}).start();
// 線程 2 再次借用,驗證復用同一對象
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getId() + ":" + pool.borrowObject());
} catch (Exception e) { e.printStackTrace(); }
}).start();
11:com.seeyon.objectPool.ObjectFactory$Computer@4e72fd4 12:com.seeyon.objectPool.ObjectFactory$Computer@4e72fd4
兩個線程先後獲取到同一對象實例,證明池化復用生效。