aooohan commented on PR #182:
URL: https://github.com/apache/commons-pool/pull/182#issuecomment-1283987610
Hi @garydgregory
Sorry for the late reply.
The following is unit test.
```java
try (final GenericObjectPool<String, RuntimeException> pool = new
GenericObjectPool<>(new BasePooledObjectFactory<String, RuntimeException>() {
@Override
public String create() {
return null;
}
@Override
public PooledObject<String> wrap(final String obj) {
return new DefaultPooledObject<>(obj);
}
})) {
for (int i = 0; i < 1000; i++) {
final BaseGenericObjectPool<String,
RuntimeException>.Evictor evictor2 = pool.new Evictor();
EvictionTimer.schedule(evictor2, Duration.ofSeconds(10),
Duration.ofSeconds(30));
}
System.gc();
System.out.println("gc结束");
TimeUnit.SECONDS.sleep(100);
}
```
There are two steps:
1. If you run it straight away, nothing appears to be happening.
2. if you modify `Reaper` a bit, you'll see that it actually throws a
`ConcurrentModificationException`, but I haven't figured out why the exception
isn't thrown in the first step.
```java
private static class Reaper implements Runnable {
@Override
public void run() {
synchronized (EvictionTimer.class) {
try {
for (final Entry<WeakReference<BaseGenericObjectPool<?,
?>.Evictor>, WeakRunner<BaseGenericObjectPool<?, ?>.Evictor>> entry : TASK_MAP
.entrySet()) {
if (entry.getKey().get() == null) {
executor.remove(entry.getValue());
TASK_MAP.remove(entry.getKey());
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(e);
}
if (TASK_MAP.isEmpty() && executor != null) {
executor.shutdown();
executor.setCorePoolSize(0);
executor = null;
}
}
}
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]