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:34 UTC

[commons-pool] branch master updated (84d1a37 -> 9bdf2ee)

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

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


    from 84d1a37  Use assertThrows.
     new 51f63c9  Fix formatting.
     new 9bdf2ee  Refactor so much duplication of the same pattern.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 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   |   9 +-
 .../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, 138 insertions(+), 305 deletions(-)

[commons-pool] 01/02: Fix formatting.

Posted by gg...@apache.org.
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 51f63c9efd4fe31dbcde345997cc638778e3f41c
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Aug 13 16:57:22 2021 -0400

    Fix formatting.
---
 .../org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java     | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

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 8fe1b10..ea043ed 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestAbandonedKeyedObjectPool.java
@@ -70,7 +70,7 @@ public class TestAbandonedKeyedObjectPool {
         public void run() {
             try {
                 sleep(20);
-                pool.returnObject(0,returned);
+                pool.returnObject(0, returned);
             } catch (final Exception e) {
                 // ignore
             }

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

Posted by gg...@apache.org.
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;
     }
 }