You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/08/13 21:58:36 UTC

[commons-pool] 02/02: Refactor so much duplication of the same pattern.

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-pool.git

commit 9bdf2ee689fe7458f98b4221f2a78767a456edb7
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Aug 13 17:58:32 2021 -0400

    Refactor so much duplication of the same pattern.
---
 src/test/java/org/apache/commons/pool2/Waiter.java |  17 +-
 .../org/apache/commons/pool2/WaiterFactory.java    |   6 +-
 .../commons/pool2/impl/AtomicIntegerFactory.java   |  31 +---
 .../pool2/impl/TestAbandonedKeyedObjectPool.java   |   7 +-
 .../pool2/impl/TestAbandonedObjectPool.java        |   7 +-
 .../pool2/impl/TestGenericKeyedObjectPool.java     | 178 ++++++---------------
 .../commons/pool2/impl/TestGenericObjectPool.java  | 162 +++++++------------
 .../TestGenericObjectPoolFactoryCreateFailure.java |  13 +-
 .../pool2/performance/SleepingObjectFactory.java   |  20 +--
 9 files changed, 137 insertions(+), 304 deletions(-)

diff --git a/src/test/java/org/apache/commons/pool2/Waiter.java b/src/test/java/org/apache/commons/pool2/Waiter.java
index 1b0f75b..78924ae 100644
--- a/src/test/java/org/apache/commons/pool2/Waiter.java
+++ b/src/test/java/org/apache/commons/pool2/Waiter.java
@@ -45,14 +45,10 @@ public class Waiter {
     }
 
     /**
-     * Wait for {@link #getLatency()} ms.
+     * Wait for {@link #getLatency()} milliseconds.
      */
     public void doWait() {
-        try {
-            Thread.sleep(latency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        sleepQuietly(latency);
     }
 
     @Override
@@ -175,4 +171,13 @@ public class Waiter {
         buff.append("latency = " + latency + '\n');
         return buff.toString();
     }
+
+    /** TODO Reuse Apache Commons Lang ThreadUtils */
+    public static void sleepQuietly(final long millis) {
+        try {
+            Thread.sleep(millis);
+        } catch (final InterruptedException e) {
+            // be quiet
+        }
+    }
 }
diff --git a/src/test/java/org/apache/commons/pool2/WaiterFactory.java b/src/test/java/org/apache/commons/pool2/WaiterFactory.java
index 8bbfc91..05d7661 100644
--- a/src/test/java/org/apache/commons/pool2/WaiterFactory.java
+++ b/src/test/java/org/apache/commons/pool2/WaiterFactory.java
@@ -131,11 +131,7 @@ KeyedPooledObjectFactory<K,Waiter> {
         if (latency == 0) {
             return;
         }
-        try {
-            Thread.sleep(latency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        Waiter.sleepQuietly(latency);
     }
 
     /**
diff --git a/src/test/java/org/apache/commons/pool2/impl/AtomicIntegerFactory.java b/src/test/java/org/apache/commons/pool2/impl/AtomicIntegerFactory.java
index e2e68ef..2f66560 100644
--- a/src/test/java/org/apache/commons/pool2/impl/AtomicIntegerFactory.java
+++ b/src/test/java/org/apache/commons/pool2/impl/AtomicIntegerFactory.java
@@ -20,6 +20,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.commons.pool2.BasePooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.Waiter;
 
 /**
  * Factory that sources PooledObjects that wrap AtomicIntegers.
@@ -40,40 +41,24 @@ public class AtomicIntegerFactory
     @Override
     public void activateObject(final PooledObject<AtomicInteger> p) {
         p.getObject().incrementAndGet();
-        try {
-            Thread.sleep(activateLatency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        Waiter.sleepQuietly(activateLatency);
     }
 
     @Override
     public AtomicInteger create() {
-        try {
-            Thread.sleep(createLatency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        Waiter.sleepQuietly(createLatency);
         return new AtomicInteger(0);
     }
 
     @Override
     public void destroyObject(final PooledObject<AtomicInteger> p) {
-        try {
-            Thread.sleep(destroyLatency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        Waiter.sleepQuietly(destroyLatency);
     }
 
     @Override
     public void passivateObject(final PooledObject<AtomicInteger> p) {
         p.getObject().decrementAndGet();
-        try {
-            Thread.sleep(passivateLatency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        Waiter.sleepQuietly(passivateLatency);
     }
 
     /**
@@ -117,11 +102,7 @@ public class AtomicIntegerFactory
 
     @Override
     public boolean validateObject(final PooledObject<AtomicInteger> instance) {
-        try {
-            Thread.sleep(validateLatency);
-        } catch (final InterruptedException ex) {
-            // ignore
-        }
+        Waiter.sleepQuietly(validateLatency);
         return instance.getObject().intValue() == 1;
     }
 
diff --git a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java
index ea043ed..70a02f2 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java
@@ -36,6 +36,7 @@ import javax.management.ObjectName;
 import org.apache.commons.pool2.DestroyMode;
 import org.apache.commons.pool2.KeyedPooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.Waiter;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -126,11 +127,7 @@ public class TestAbandonedKeyedObjectPool {
 
         @Override
         public boolean validateObject(final Integer key, final PooledObject<PooledTestObject> obj) {
-            try {
-                Thread.sleep(validateLatency);
-            } catch (final Exception ex) {
-                // ignore
-            }
+            Waiter.sleepQuietly(validateLatency);
             return true;
         }
     }
diff --git a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java
index 5207c00..b2e37f1 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedObjectPool.java
@@ -39,6 +39,7 @@ import org.apache.commons.pool2.DestroyMode;
 import org.apache.commons.pool2.PooledObject;
 import org.apache.commons.pool2.PooledObjectFactory;
 import org.apache.commons.pool2.TrackedUse;
+import org.apache.commons.pool2.Waiter;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -206,11 +207,7 @@ public class TestAbandonedObjectPool {
 
         @Override
         public boolean validateObject(final PooledObject<PooledTestObject> obj) {
-            try {
-                Thread.sleep(validateLatency);
-            } catch (final Exception ex) {
-                // ignore
-            }
+            Waiter.sleepQuietly(validateLatency);
             return true;
         }
     }
diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
index 5800273..f4bf94f 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
@@ -198,12 +198,9 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         }
 
         private void doWait(final long latency) {
-            try {
-                Thread.sleep(latency);
-            } catch (final InterruptedException ex) {
-                // ignore
-            }
+            Waiter.sleepQuietly(latency);
         }
+        
         @Override
         public PooledObject<String> makeObject(final K key) throws Exception {
             if (exceptionOnCreate) {
@@ -336,11 +333,7 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         @Override
         public boolean evict(final EvictionConfig config, final PooledObject<T> underTest,
                 final int idleCount) {
-            try {
-                Thread.sleep(delay);
-            } catch (final InterruptedException e) {
-                // ignore
-            }
+            Waiter.sleepQuietly(delay);
             return super.evict(config, underTest, idleCount);
         }
     }
@@ -403,11 +396,7 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         public void run() {
             for(int i=0;i<_iter;i++) {
                 final String key = _key == null ? String.valueOf(_random.nextInt(3)) : _key;
-                try {
-                    Thread.sleep(_randomDelay ? _random.nextInt(_startDelay) : _startDelay);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(_randomDelay ? _random.nextInt(_startDelay) : _startDelay);
                 T obj = null;
                 try {
                     obj = _pool.borrowObject(key);
@@ -425,11 +414,7 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
                     break;
                 }
 
-                try {
-                    Thread.sleep(_randomDelay ? _random.nextInt(_holdTime) : _holdTime);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(_randomDelay ? _random.nextInt(_holdTime) : _holdTime);
                 try {
                     _pool.returnObject(key,obj);
                 } catch(final Exception e) {
@@ -857,11 +842,7 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         }
         for (final TestThread<T> testThread : threads) {
             while(!(testThread.complete())) {
-                try {
-                    Thread.sleep(500L);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(500L);
             }
             if(testThread.failed()) {
                 fail("Thread failed: " + threads.indexOf(testThread) + "\n" +
@@ -994,16 +975,12 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         }
 
         // Wait for threads to finish
-        for(int i=0;i<numThreads;i++) {
-            while(!(threads[i]).complete()) {
-                try {
-                    Thread.sleep(500L);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+        for (int i = 0; i < numThreads; i++) {
+            while (!(threads[i]).complete()) {
+                Waiter.sleepQuietly(500L);
             }
-            if(threads[i].failed()) {
-                fail("Thread "+i+" failed: "+threads[i]._exception.toString());
+            if (threads[i].failed()) {
+                fail("Thread " + i + " failed: " + threads[i]._exception.toString());
             }
         }
     }
@@ -1266,17 +1243,9 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
             for (int i = 0; i < 5; i++) {
                 p.addObject("one");
             }
-            try {
-                Thread.sleep(100);
-            } catch (final InterruptedException e) {
-                // ignore
-            }
+            Waiter.sleepQuietly(100);
             assertEquals(5, p.getNumIdle("one"));
-            try {
-                Thread.sleep(500);
-            } catch (final InterruptedException e) {
-                // ignore
-            }
+            Waiter.sleepQuietly(500);
             assertEquals(0, p.getNumIdle("one"));
         }
     }
@@ -1316,17 +1285,17 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
             gkoPool.returnObject("",active[i]);
         }
 
-        try { Thread.sleep(1000L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(1000L);
         assertTrue(gkoPool.getNumIdle("") < 500, "Should be less than 500 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 400, "Should be less than 400 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 300,"Should be less than 300 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 200, "Should be less than 200 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 100 , "Should be less than 100 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertEquals(0,gkoPool.getNumIdle(""),"Should be zero idle, found " + gkoPool.getNumIdle(""));
 
         for(int i=0;i<500;i++) {
@@ -1336,17 +1305,17 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
             gkoPool.returnObject("",active[i]);
         }
 
-        try { Thread.sleep(1000L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(1000L);
         assertTrue(gkoPool.getNumIdle("") < 500,"Should be less than 500 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 400,"Should be less than 400 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 300,"Should be less than 300 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 200,"Should be less than 200 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(gkoPool.getNumIdle("") < 100,"Should be less than 100 idle, found " + gkoPool.getNumIdle(""));
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertEquals(0,gkoPool.getNumIdle(""),"Should be zero idle, found " + gkoPool.getNumIdle(""));
     }
 
@@ -1370,72 +1339,28 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
             gkoPool.returnObject("2", active2[i]);
         }
 
-        try {
-            Thread.sleep(1100L);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(1100L);
         assertTrue(gkoPool.getNumIdle() < 1000, "Should be less than 1000 idle, found " + gkoPool.getNumIdle());
         final long sleepMillisPart2 = 600L;
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 900, "Should be less than 900 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 800, "Should be less than 800 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 700, "Should be less than 700 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 600, "Should be less than 600 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 500, "Should be less than 500 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 400, "Should be less than 400 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 300, "Should be less than 300 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 200, "Should be less than 200 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertTrue(gkoPool.getNumIdle() < 100, "Should be less than 100 idle, found " + gkoPool.getNumIdle());
-        try {
-            Thread.sleep(sleepMillisPart2);
-        } catch (final InterruptedException e) {
-            // ignore
-        }
+        Waiter.sleepQuietly(sleepMillisPart2);
         assertEquals(0, gkoPool.getNumIdle(), "Should be zero idle, found " + gkoPool.getNumIdle());
     }
 
@@ -2122,33 +2047,32 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         gkoPool.setTimeBetweenEvictionRuns(Duration.ofMillis(100));
         gkoPool.setTestWhileIdle(true);
 
-
-        //Generate a random key
+        // Generate a random key
         final String key = "A";
 
         gkoPool.preparePool(key);
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
 
         final String[] active = new String[5];
         active[0] = gkoPool.borrowObject(key);
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
 
-        for(int i=1 ; i<5 ; i++) {
+        for (int i = 1; i < 5; i++) {
             active[i] = gkoPool.borrowObject(key);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
 
-        for(int i=0 ; i<5 ; i++) {
+        for (int i = 0; i < 5; i++) {
             gkoPool.returnObject(key, active[i]);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(10, gkoPool.getNumIdle(), "Should be 10 idle, found " + gkoPool.getNumIdle());
     }
 
@@ -2169,40 +2093,40 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " +
                 gkoPool.getNumIdle());
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
 
         final String[] active = new String[10];
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
 
         for(int i=0 ; i<5 ; i++) {
             active[i] = gkoPool.borrowObject(key);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
 
         for(int i=0 ; i<5 ; i++) {
             gkoPool.returnObject(key, active[i]);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(10, gkoPool.getNumIdle(), "Should be 10 idle, found " + gkoPool.getNumIdle());
 
         for(int i=0 ; i<10 ; i++) {
             active[i] = gkoPool.borrowObject(key);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(0, gkoPool.getNumIdle(), "Should be 0 idle, found " + gkoPool.getNumIdle());
 
         for(int i=0 ; i<10 ; i++) {
             gkoPool.returnObject(key, active[i]);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(10, gkoPool.getNumIdle(), "Should be 10 idle, found " + gkoPool.getNumIdle());
     }
 
@@ -2221,13 +2145,13 @@ public class TestGenericKeyedObjectPool extends TestKeyedObjectPool {
         //Generate a random key
         final String key = "A";
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(0, gkoPool.getNumIdle(), "Should be 0 idle, found " + gkoPool.getNumIdle());
 
         final Object active = gkoPool.borrowObject(key);
         assertNotNull(active);
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, gkoPool.getNumIdle(), "Should be 5 idle, found " + gkoPool.getNumIdle());
     }
 
diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java
index dd417bd..430e7d3 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java
@@ -225,11 +225,7 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
         }
         @Override
         public boolean validateObject(final PooledObject<Object> obj) {
-            try {
-                Thread.sleep(1000);
-            } catch (final InterruptedException e) {
-                // Ignore
-            }
+            Waiter.sleepQuietly(1000);
             return false;
         }
 
@@ -316,11 +312,7 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             }
         }
         private void doWait(final long latency) {
-            try {
-                Thread.sleep(latency);
-            } catch (final InterruptedException ex) {
-                // ignore
-            }
+            Waiter.sleepQuietly(latency);
         }
         public synchronized int getMakeCounter() {
             return makeCounter;
@@ -521,11 +513,7 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
                     _randomDelay ? (long)_random.nextInt(_startDelay) : _startDelay;
                 final long holdTime =
                     _randomDelay ? (long)_random.nextInt(_holdTime) : _holdTime;
-                try {
-                    Thread.sleep(startDelay);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(startDelay);
                 T obj = null;
                 try {
                     obj = _pool.borrowObject();
@@ -543,11 +531,7 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
                     break;
                 }
 
-                try {
-                    Thread.sleep(holdTime);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(holdTime);
                 try {
                     _pool.returnObject(obj);
                 } catch(final Exception e) {
@@ -915,20 +899,16 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
     })
     private void runTestThreads(final int numThreads, final int iterations, final int delay, final GenericObjectPool testPool) {
         final TestThread[] threads = new TestThread[numThreads];
-        for(int i=0;i<numThreads;i++) {
-            threads[i] = new TestThread<String>(testPool,iterations,delay);
+        for (int i = 0; i < numThreads; i++) {
+            threads[i] = new TestThread<String>(testPool, iterations, delay);
             final Thread t = new Thread(threads[i]);
             t.start();
         }
-        for(int i=0;i<numThreads;i++) {
-            while(!(threads[i]).complete()) {
-                try {
-                    Thread.sleep(500L);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+        for (int i = 0; i < numThreads; i++) {
+            while (!(threads[i]).complete()) {
+                Waiter.sleepQuietly(500L);
             }
-            if(threads[i].failed()) {
+            if (threads[i].failed()) {
                 fail("Thread " + i + " failed: " + threads[i]._error.toString());
             }
         }
@@ -1534,17 +1514,17 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             genericObjectPool.returnObject(active[i]);
         }
 
-        try { Thread.sleep(1000L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(1000L);
         assertTrue(genericObjectPool.getNumIdle() < 500,"Should be less than 500 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 400,"Should be less than 400 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 300,"Should be less than 300 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 200,"Should be less than 200 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 100,"Should be less than 100 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertEquals(0,genericObjectPool.getNumIdle(),"Should be zero idle, found " + genericObjectPool.getNumIdle());
 
         for (int i = 0; i < 500; i++) {
@@ -1554,17 +1534,17 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             genericObjectPool.returnObject(active[i]);
         }
 
-        try { Thread.sleep(1000L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(1000L);
         assertTrue(genericObjectPool.getNumIdle() < 500,"Should be less than 500 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 400,"Should be less than 400 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 300,"Should be less than 300 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 200,"Should be less than 200 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertTrue(genericObjectPool.getNumIdle() < 100,"Should be less than 100 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(600L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(600L);
         assertEquals(0,genericObjectPool.getNumIdle(),"Should be zero idle, found " + genericObjectPool.getNumIdle());
     }
 
@@ -1683,12 +1663,12 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
         // Eviction policy ignores first 1500 attempts to evict and then always
         // evicts. After 1s, there should have been two runs of 500 tests so no
         // evictions
-        try { Thread.sleep(1000L); } catch(final InterruptedException e) { }
-        assertEquals( 500, genericObjectPool.getNumIdle(),"Should be 500 idle");
+        Waiter.sleepQuietly(1000L);
+        assertEquals(500, genericObjectPool.getNumIdle(), "Should be 500 idle");
         // A further 1s wasn't enough so allow 2s for the evictor to clear out
         // all of the idle objects.
-        try { Thread.sleep(2000L); } catch(final InterruptedException e) { }
-        assertEquals( 0, genericObjectPool.getNumIdle(),"Should be 0 idle");
+        Waiter.sleepQuietly(2000L);
+        assertEquals(0, genericObjectPool.getNumIdle(), "Should be 0 idle");
     }
 
     @Test
@@ -1767,13 +1747,13 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             genericObjectPool.returnObject(active[i]);
         }
 
-        try { Thread.sleep(100L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(100L);
         assertTrue(genericObjectPool.getNumIdle() <= 6,"Should at most 6 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(100L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(100L);
         assertTrue(genericObjectPool.getNumIdle() <= 3,"Should at most 3 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(100L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(100L);
         assertTrue(genericObjectPool.getNumIdle() <= 2,"Should be at most 2 idle, found " + genericObjectPool.getNumIdle());
-        try { Thread.sleep(100L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(100L);
         assertEquals(0,genericObjectPool.getNumIdle(),"Should be zero idle, found " + genericObjectPool.getNumIdle());
     }
 
@@ -2184,30 +2164,18 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             t.start();
         }
         // Give the threads a chance to start doing some work
-        try {
-            Thread.sleep(100);
-        } catch(final InterruptedException e) {
-            // ignored
-        }
+        Waiter.sleepQuietly(100L);
 
         for (int i = 0; i < numIter; i++) {
             String obj = null;
             try {
-                try {
-                    Thread.sleep(delay);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(delay);
                 obj = genericObjectPool.borrowObject();
                 // Under load, observed _numActive > _maxTotal
                 if (genericObjectPool.getNumActive() > genericObjectPool.getMaxTotal()) {
                     throw new IllegalStateException("Too many active objects");
                 }
-                try {
-                    Thread.sleep(delay);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(delay);
             } catch (final Exception e) {
                 // Shouldn't happen
                 e.printStackTrace();
@@ -2223,17 +2191,13 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             }
         }
 
-        for(int i=0;i<numThreads;i++) {
-            while(!(threads[i]).complete()) {
-                try {
-                    Thread.sleep(500L);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+        for (int i = 0; i < numThreads; i++) {
+            while (!(threads[i]).complete()) {
+                Waiter.sleepQuietly(500L);
             }
-            if(threads[i].failed()) {
+            if (threads[i].failed()) {
                 threads[i]._error.printStackTrace();
-                fail("Thread "+i+" failed: "+threads[i]._error.toString());
+                fail("Thread " + i + " failed: " + threads[i]._error.toString());
             }
         }
     }
@@ -2301,30 +2265,18 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             t.start();
         }
         // Give the threads a chance to start doing some work
-        try {
-            Thread.sleep(5000);
-        } catch(final InterruptedException e) {
-            // ignored
-        }
+        Waiter.sleepQuietly(5000);
 
         for (int i = 0; i < numIter; i++) {
             String obj = null;
             try {
-                try {
-                    Thread.sleep(delay);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(delay);
                 obj = genericObjectPool.borrowObject();
                 // Under load, observed _numActive > _maxTotal
                 if (genericObjectPool.getNumActive() > genericObjectPool.getMaxTotal()) {
                     throw new IllegalStateException("Too many active objects");
                 }
-                try {
-                    Thread.sleep(delay);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(delay);
             } catch (final Exception e) {
                 // Shouldn't happen
                 e.printStackTrace();
@@ -2342,11 +2294,7 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
 
         for (int i = 0; i < numThreads; i++) {
             while(!(threads[i]).complete()) {
-                try {
-                    Thread.sleep(500L);
-                } catch(final InterruptedException e) {
-                    // ignored
-                }
+                Waiter.sleepQuietly(500L);
             }
             if(threads[i].failed()) {
                 fail("Thread " + i + " failed: " + threads[i]._error.toString());
@@ -2434,27 +2382,27 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
         genericObjectPool.setTimeBetweenEvictionRuns(Duration.ofMillis(100));
         genericObjectPool.setTestWhileIdle(true);
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, genericObjectPool.getNumIdle(), "Should be 5 idle, found " + genericObjectPool.getNumIdle());
 
         final String[] active = new String[5];
         active[0] = genericObjectPool.borrowObject();
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, genericObjectPool.getNumIdle(), "Should be 5 idle, found " + genericObjectPool.getNumIdle());
 
-        for(int i=1 ; i<5 ; i++) {
+        for (int i = 1; i < 5; i++) {
             active[i] = genericObjectPool.borrowObject();
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, genericObjectPool.getNumIdle(), "Should be 5 idle, found " + genericObjectPool.getNumIdle());
 
-        for(int i=0 ; i<5 ; i++) {
+        for (int i = 0; i < 5; i++) {
             genericObjectPool.returnObject(active[i]);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(10, genericObjectPool.getNumIdle(), "Should be 10 idle, found " + genericObjectPool.getNumIdle());
     }
 
@@ -2469,40 +2417,40 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
         genericObjectPool.setTimeBetweenEvictionRuns(Duration.ofMillis(100));
         genericObjectPool.setTestWhileIdle(true);
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, genericObjectPool.getNumIdle(), "Should be 5 idle, found " + genericObjectPool.getNumIdle());
 
         final String[] active = new String[10];
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, genericObjectPool.getNumIdle(), "Should be 5 idle, found " + genericObjectPool.getNumIdle());
 
         for (int i = 0; i < 5; i++) {
             active[i] = genericObjectPool.borrowObject();
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(5, genericObjectPool.getNumIdle(), "Should be 5 idle, found " + genericObjectPool.getNumIdle());
 
         for(int i = 0 ; i < 5 ; i++) {
             genericObjectPool.returnObject(active[i]);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(10, genericObjectPool.getNumIdle(), "Should be 10 idle, found " + genericObjectPool.getNumIdle());
 
         for (int i = 0; i < 10; i++) {
             active[i] = genericObjectPool.borrowObject();
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(0, genericObjectPool.getNumIdle(), "Should be 0 idle, found " + genericObjectPool.getNumIdle());
 
         for (int i = 0; i < 10; i++) {
             genericObjectPool.returnObject(active[i]);
         }
 
-        try { Thread.sleep(150L); } catch(final InterruptedException e) { }
+        Waiter.sleepQuietly(150L);
         assertEquals(10, genericObjectPool.getNumIdle(), "Should be 10 idle, found " + genericObjectPool.getNumIdle());
     }
 
@@ -2855,7 +2803,7 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
             genericObjectPool.setTimeBetweenEvictionRuns(Duration.ofMillis(50));
 
             // wait a second (well, .2 seconds)
-            try { Thread.sleep(200L); } catch(final InterruptedException e) { }
+            Waiter.sleepQuietly(200L);
 
             // assert that the evictor has cleared out the pool
             assertEquals(0,genericObjectPool.getNumIdle(),"Should have 0 idle");
diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPoolFactoryCreateFailure.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPoolFactoryCreateFailure.java
index 0435252..e7a6fb1 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPoolFactoryCreateFailure.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPoolFactoryCreateFailure.java
@@ -26,6 +26,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.commons.pool2.BasePooledObjectFactory;
 import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.Waiter;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.Timeout;
 
@@ -79,7 +80,7 @@ public class TestGenericObjectPoolFactoryCreateFailure {
                     failed.set(true);
                 } else {
                     // just to make sure, borrowObject has started waiting on queue
-                    sleepIgnoreException(1000);
+                    Waiter.sleepQuietly(1000);
                 }
 
                 pool.returnObject(obj);
@@ -95,14 +96,6 @@ public class TestGenericObjectPoolFactoryCreateFailure {
         // System.out.println(msg);
     }
 
-    private static void sleepIgnoreException(final long millis) {
-        try {
-            Thread.sleep(millis);
-        } catch(final Throwable e) {
-            // ignore
-        }
-    }
-
     @Test
     @Timeout(value = 10_000, unit = TimeUnit.MILLISECONDS)
     public void testBorrowObjectStuck() {
@@ -129,7 +122,7 @@ public class TestGenericObjectPoolFactoryCreateFailure {
 
             // wait for object to be created
             while (!factory.created.get()) {
-                sleepIgnoreException(5);
+                Waiter.sleepQuietly((long) 5);
             }
 
             // now borrow
diff --git a/src/test/java/org/apache/commons/pool2/performance/SleepingObjectFactory.java b/src/test/java/org/apache/commons/pool2/performance/SleepingObjectFactory.java
index 08f5f89..bcf0165 100644
--- a/src/test/java/org/apache/commons/pool2/performance/SleepingObjectFactory.java
+++ b/src/test/java/org/apache/commons/pool2/performance/SleepingObjectFactory.java
@@ -19,6 +19,7 @@ package org.apache.commons.pool2.performance;
 
 import org.apache.commons.pool2.PooledObject;
 import org.apache.commons.pool2.PooledObjectFactory;
+import org.apache.commons.pool2.Waiter;
 import org.apache.commons.pool2.impl.DefaultPooledObject;
 
 /**
@@ -32,7 +33,7 @@ public class SleepingObjectFactory implements PooledObjectFactory<Integer> {
     @Override
     public void activateObject(final PooledObject<Integer> obj) throws Exception {
         debug("activateObject", obj);
-        sleep(10);
+        Waiter.sleepQuietly(10);
     }
 
     private void debug(final String method, final Object obj) {
@@ -45,7 +46,7 @@ public class SleepingObjectFactory implements PooledObjectFactory<Integer> {
     @Override
     public void destroyObject(final PooledObject<Integer> obj) throws Exception {
         debug("destroyObject", obj);
-        sleep(250);
+        Waiter.sleepQuietly(250);
     }
 
     public boolean isDebug() {
@@ -58,33 +59,24 @@ public class SleepingObjectFactory implements PooledObjectFactory<Integer> {
         // check for a specific object.
         final Integer obj = Integer.valueOf(counter++);
         debug("makeObject", obj);
-        sleep(500);
+        Waiter.sleepQuietly(500);
         return new DefaultPooledObject<>(obj);
     }
 
     @Override
     public void passivateObject(final PooledObject<Integer> obj) throws Exception {
         debug("passivateObject", obj);
-        sleep(10);
+        Waiter.sleepQuietly(10);
     }
 
     public void setDebug(final boolean b) {
         debug = b;
     }
 
-    private void sleep(final long millis) {
-        try {
-            Thread.sleep(millis);
-        }
-        catch (final InterruptedException e) {
-            // ignore
-        }
-    }
-
     @Override
     public boolean validateObject(final PooledObject<Integer> obj) {
         debug("validateObject", obj);
-        sleep(30);
+        Waiter.sleepQuietly(30);
         return true;
     }
 }