SLING-7526 - NPE in DefaultThreadPool$LoggingThreadLocalChangeListener.changed

Ensure that we tolerate null values in the
LoggingThreadLocalChangeListener
diff --git a/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPool.java b/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPool.java
index 99cdec5..604092a 100644
--- a/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPool.java
+++ b/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPool.java
@@ -169,7 +169,8 @@
     private static class LoggingThreadLocalChangeListener implements ThreadLocalChangeListener {
         @Override
         public void changed(Mode mode, Thread thread, ThreadLocal<?> threadLocal, Object value) {
-            LOGGER.debug("Thread '{}' {} ThreadLocal {} with value {}", thread, mode, threadLocal.getClass(), value);
+            LOGGER.debug("Thread '{}' {} ThreadLocal {} with value {}", thread, mode, 
+                    threadLocal != null ? threadLocal.getClass() : "<null>", value);
         }
     }
 
diff --git a/src/main/java/org/apache/sling/commons/threads/impl/ThreadLocalChangeListener.java b/src/main/java/org/apache/sling/commons/threads/impl/ThreadLocalChangeListener.java
index 548ecb4..27954f2 100644
--- a/src/main/java/org/apache/sling/commons/threads/impl/ThreadLocalChangeListener.java
+++ b/src/main/java/org/apache/sling/commons/threads/impl/ThreadLocalChangeListener.java
@@ -28,6 +28,16 @@
 
     Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
+    /**
+     * Invoked when the cleaner detects that a thread-local value was added of removed 
+     * after an execution has completed
+     * 
+     * @param the mode
+     * @param the thread
+     * @param the thread local, possibly null
+     * @param the value, possibly null
+     */
+    
     void changed(Mode mode, Thread thread, ThreadLocal<?> threadLocal, Object value);
 
     enum Mode {