From c66f9e167ca32887374ec07a05fd3bddaeb8c2d5 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Mon, 7 Sep 2020 13:10:25 -0400 Subject: [PATCH] allow background threads to have names --- .../cobbzilla/util/daemon/BufferedRunDaemon.java | 2 +- .../org/cobbzilla/util/daemon/ZillaRuntime.java | 16 +++++++++++++++- .../io/FilterInputStreamViaOutputStream.java | 2 +- .../java/org/cobbzilla/util/main/BaseMain.java | 4 ++++ .../util/io/regex/RegexFilterReaderTest.java | 8 ++++---- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/cobbzilla/util/daemon/BufferedRunDaemon.java b/src/main/java/org/cobbzilla/util/daemon/BufferedRunDaemon.java index be9ff3e..d893cf4 100644 --- a/src/main/java/org/cobbzilla/util/daemon/BufferedRunDaemon.java +++ b/src/main/java/org/cobbzilla/util/daemon/BufferedRunDaemon.java @@ -32,7 +32,7 @@ public class BufferedRunDaemon implements Runnable { protected long getIdleSyncInterval() { return IDLE_SYNC_INTERVAL; } protected long getMinSyncWait () { return MIN_SYNC_WAIT; } - public void start () { daemonThread.set(background(this)); } + public void start () { daemonThread.set(background(this, "BufferedRunDaemon")); } protected void interrupt() { if (daemonThread.get() != null) daemonThread.get().interrupt(); } diff --git a/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java b/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java index 8393911..0975feb 100644 --- a/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java +++ b/src/main/java/org/cobbzilla/util/daemon/ZillaRuntime.java @@ -24,6 +24,8 @@ import java.math.RoundingMode; import java.security.SecureRandom; import java.util.*; import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Function; @@ -105,9 +107,16 @@ public class ZillaRuntime { public static boolean bool(Boolean b) { return b != null && b; } public static boolean bool(Boolean b, boolean val) { return b != null ? b : val; } + private static final AtomicInteger backgroundCounter = new AtomicInteger(0); + private static final Map backgroundNameCounters = new ConcurrentHashMap<>(50); + public static Thread background (Runnable r) { return background(r, DEFAULT_EX_RUNNABLE); } - public static Thread background (Runnable r, ExceptionHandler ex) { + public static Thread background (Runnable r, ExceptionHandler ex) { return background(r, null, ex); } + + public static Thread background (Runnable r, String name) { return background(r, name, DEFAULT_EX_RUNNABLE); } + + public static Thread background (Runnable r, String name, ExceptionHandler ex) { final Thread t = new Thread(() -> { try { r.run(); @@ -115,6 +124,11 @@ public class ZillaRuntime { ex.handle(e); } }); + final AtomicInteger counter = name == null + ? backgroundCounter + : backgroundNameCounters.computeIfAbsent(name, k -> new AtomicInteger(0)); + if (name == null) name = "background"; + t.setName(name+"-"+counter.incrementAndGet()); t.start(); return t; } diff --git a/src/main/java/org/cobbzilla/util/io/FilterInputStreamViaOutputStream.java b/src/main/java/org/cobbzilla/util/io/FilterInputStreamViaOutputStream.java index c299a8b..237e33e 100644 --- a/src/main/java/org/cobbzilla/util/io/FilterInputStreamViaOutputStream.java +++ b/src/main/java/org/cobbzilla/util/io/FilterInputStreamViaOutputStream.java @@ -91,7 +91,7 @@ public class FilterInputStreamViaOutputStream extends PipedInputStream implement closeQuietly(out); closeQuietly(pipeOut); if (this.thread.isAlive()) { - background(() -> terminate(this.thread, THREAD_TERMINATE_TIMEOUT)); + background(() -> terminate(this.thread, THREAD_TERMINATE_TIMEOUT), "FilterInputStreamViaOutputStream.close"); } } diff --git a/src/main/java/org/cobbzilla/util/main/BaseMain.java b/src/main/java/org/cobbzilla/util/main/BaseMain.java index 2dddcf2..e7a6098 100644 --- a/src/main/java/org/cobbzilla/util/main/BaseMain.java +++ b/src/main/java/org/cobbzilla/util/main/BaseMain.java @@ -109,6 +109,10 @@ public abstract class BaseMain { return background(new RunWithHandler(this, errorHandler), errorHandler); } + public Thread runInBackground (String name, ExceptionHandler errorHandler) { + return background(new RunWithHandler(this, errorHandler), name, errorHandler); + } + @AllArgsConstructor private static class RunWithHandler implements Runnable { private final BaseMain runnable; diff --git a/src/test/java/org/cobbzilla/util/io/regex/RegexFilterReaderTest.java b/src/test/java/org/cobbzilla/util/io/regex/RegexFilterReaderTest.java index 699e62d..9d84a07 100644 --- a/src/test/java/org/cobbzilla/util/io/regex/RegexFilterReaderTest.java +++ b/src/test/java/org/cobbzilla/util/io/regex/RegexFilterReaderTest.java @@ -92,7 +92,7 @@ public class RegexFilterReaderTest { } catch (IOException e) { die("Error copying in background: "+e, e); } - }); + }, "RegexFilterReaderTest.testMultiStreamRegexReader"); sleep(500); multiReader.addReader(reader2); @@ -132,7 +132,7 @@ public class RegexFilterReaderTest { } catch (IOException e) { die("Error copying in background: "+e, e); } - }); + }, "RegexFilterReaderTest.testMultiStreamRegexReaderWithRegexAcrossBoundary"); sleep(500); multiReader.addReader(reader2); @@ -168,7 +168,7 @@ public class RegexFilterReaderTest { } catch (IOException e) { exRef.set(e); } - }); + }, "RegexFilterReaderTest.testMultiReaderUnderflow"); sleep(multiReader.getUnderflow().getMaxUnderflowSleep()); log.info("adding reader2..."); @@ -212,7 +212,7 @@ public class RegexFilterReaderTest { } catch (Exception e) { exRef.set(e); } - }); + }, "RegexFilterReaderTest.testMultiStreamUnderflow"); sleep(multiStream.getUnderflow().getUnderflowTimeout()*2);