Skip to content

Commit d0a2822

Browse files
committed
refactor: 优化close
1 parent 33891b4 commit d0a2822

2 files changed

Lines changed: 36 additions & 33 deletions

File tree

hsweb-core/src/main/java/org/hswebframework/web/recycler/Recycler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ default <A, A1, A2, A3, R> R doWith(A arg0, A1 arg1, A2 arg2, A3 arg3, Function5
161161
* <p>已借出的对象不在此方法内强制回收;它们后续调用 {@link Recyclable#recycle()} 时会被销毁而不是重新入池。
162162
*/
163163
@Override
164-
void close();
164+
default void close() {
165+
}
165166

166167
}

hsweb-core/src/test/java/org/hswebframework/web/recycler/RecyclerImplTest.java

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import org.junit.Test;
55
import reactor.core.scheduler.Schedulers;
66

7+
import java.util.concurrent.CountDownLatch;
8+
import java.util.concurrent.TimeUnit;
79
import java.util.concurrent.atomic.AtomicInteger;
810
import java.util.concurrent.atomic.AtomicReference;
911
import java.util.function.BiFunction;
@@ -236,37 +238,36 @@ public void testStaticFactory() {
236238
}
237239

238240
@Test
239-
public void testStaticFactoryKeepsThreadLocalReuseForPlainObjects() {
241+
public void testStaticFactoryKeepsThreadLocalReuseForPlainObjects() throws InterruptedException {
240242
Recycler<StringBuilder> recycler = Recycler.create(factory, rest, 2);
241-
242-
Integer created = Schedulers
243-
.parallel()
244-
.schedule(() -> {
245-
}) == null ? null : null;
246243
AtomicReference<Integer> createdCount = new AtomicReference<>();
244+
CountDownLatch latch = new CountDownLatch(1);
245+
247246
Schedulers
248247
.parallel()
249248
.schedule(() -> {
250-
recycler.doWith(sb -> {
251-
sb.append("first");
252-
return sb.toString();
253-
});
254-
recycler.doWith(sb -> {
255-
sb.append("second");
256-
return sb.toString();
257-
});
258-
createdCount.set(createCount.get());
249+
try {
250+
recycler.doWith(sb -> {
251+
sb.append("first");
252+
return sb.toString();
253+
});
254+
recycler.doWith(sb -> {
255+
sb.append("second");
256+
return sb.toString();
257+
});
258+
createdCount.set(createCount.get());
259+
} finally {
260+
latch.countDown();
261+
}
259262
});
260263

261-
while (createdCount.get() == null) {
262-
Thread.yield();
263-
}
264+
assertTrue(latch.await(5, TimeUnit.SECONDS));
264265

265266
assertEquals(Integer.valueOf(1), createdCount.get());
266267
}
267268

268269
@Test
269-
public void testDestroyFactoryDoesNotUseThreadLocalForManagedResources() {
270+
public void testDestroyFactoryDoesNotUseThreadLocalForManagedResources() throws InterruptedException {
270271
Recycler<TestResource> recycler = Recycler.create(
271272
TestResource::new,
272273
TestResource::reset,
@@ -275,25 +276,26 @@ public void testDestroyFactoryDoesNotUseThreadLocalForManagedResources() {
275276
);
276277
AtomicReference<TestResource> first = new AtomicReference<>();
277278
AtomicReference<TestResource> second = new AtomicReference<>();
278-
AtomicReference<Boolean> complete = new AtomicReference<>();
279+
CountDownLatch latch = new CountDownLatch(1);
279280

280281
Schedulers
281282
.parallel()
282283
.schedule(() -> {
283-
recycler.doWith(resource -> {
284-
first.set(resource);
285-
return resource.toString();
286-
});
287-
recycler.doWith(resource -> {
288-
second.set(resource);
289-
return resource.toString();
290-
});
291-
complete.set(Boolean.TRUE);
284+
try {
285+
recycler.doWith(resource -> {
286+
first.set(resource);
287+
return resource.toString();
288+
});
289+
recycler.doWith(resource -> {
290+
second.set(resource);
291+
return resource.toString();
292+
});
293+
} finally {
294+
latch.countDown();
295+
}
292296
});
293297

294-
while (complete.get() == null) {
295-
Thread.yield();
296-
}
298+
assertTrue(latch.await(5, TimeUnit.SECONDS));
297299

298300
assertSame(first.get(), second.get());
299301
recycler.close();

0 commit comments

Comments
 (0)