You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pa...@apache.org on 2018/04/29 09:20:45 UTC
[2/3] commons-io git commit: IO-535: Thread bug in
FileAlterationMonitor#stop(int) (closes #58, #36)
IO-535: Thread bug in FileAlterationMonitor#stop(int) (closes #58, #36)
Interrupt the thread created by FileAlterationMonitor on stop()
Project: http://git-wip-us.apache.org/repos/asf/commons-io/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-io/commit/a4705cc3
Tree: http://git-wip-us.apache.org/repos/asf/commons-io/tree/a4705cc3
Diff: http://git-wip-us.apache.org/repos/asf/commons-io/diff/a4705cc3
Branch: refs/heads/master
Commit: a4705cc3c310ffb422336b319891f63eef021f1c
Parents: e9eb2d8
Author: Svetlin Zarev <sv...@abv.bg>
Authored: Sun Apr 29 11:11:00 2018 +0200
Committer: pascalschumacher <pa...@gmx.net>
Committed: Sun Apr 29 11:16:23 2018 +0200
----------------------------------------------------------------------
.../io/monitor/FileAlterationMonitor.java | 1 +
.../monitor/FileAlterationMonitorTestCase.java | 36 ++++++++++++++++++++
2 files changed, 37 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-io/blob/a4705cc3/src/main/java/org/apache/commons/io/monitor/FileAlterationMonitor.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/io/monitor/FileAlterationMonitor.java b/src/main/java/org/apache/commons/io/monitor/FileAlterationMonitor.java
index 3ef82df..5129f23 100644
--- a/src/main/java/org/apache/commons/io/monitor/FileAlterationMonitor.java
+++ b/src/main/java/org/apache/commons/io/monitor/FileAlterationMonitor.java
@@ -164,6 +164,7 @@ public final class FileAlterationMonitor implements Runnable {
}
running = false;
try {
+ thread.interrupt();
thread.join(stopInterval);
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
http://git-wip-us.apache.org/repos/asf/commons-io/blob/a4705cc3/src/test/java/org/apache/commons/io/monitor/FileAlterationMonitorTestCase.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/io/monitor/FileAlterationMonitorTestCase.java b/src/test/java/org/apache/commons/io/monitor/FileAlterationMonitorTestCase.java
index 200f858..1d1037b 100644
--- a/src/test/java/org/apache/commons/io/monitor/FileAlterationMonitorTestCase.java
+++ b/src/test/java/org/apache/commons/io/monitor/FileAlterationMonitorTestCase.java
@@ -22,9 +22,11 @@ import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
import org.apache.commons.io.testtools.TestUtils;
import org.junit.Test;
@@ -176,4 +178,38 @@ public class FileAlterationMonitorTestCase extends AbstractMonitorTestCase {
}
fail(label + " " + file + " not found");
}
+
+ /**
+ * Test case for IO-535
+ *
+ * Verify that {@link FileAlterationMonitor#stop()} stops the created thread
+ */
+ @Test
+ public void testStopWhileWaitingForNextInterval() throws Exception {
+ final Collection<Thread> createdThreads = new ArrayList<>(1);
+ final ThreadFactory threadFactory = new ThreadFactory() {
+ private final ThreadFactory delegate = Executors.defaultThreadFactory();
+
+ @Override
+ public Thread newThread(Runnable r) {
+ final Thread thread = delegate.newThread(r);
+ thread.setDaemon(true); //do not leak threads if the test fails
+ createdThreads.add(thread);
+ return thread;
+ }
+ };
+
+ final FileAlterationMonitor monitor = new FileAlterationMonitor(1_000);
+ monitor.setThreadFactory(threadFactory);
+
+ monitor.start();
+ assertFalse(createdThreads.isEmpty());
+
+ Thread.sleep(10); // wait until the watcher thread enters Thread.sleep()
+ monitor.stop(100);
+
+ for (Thread thread : createdThreads) {
+ assertFalse("The FileAlterationMonitor did not stop the threads it created.", thread.isAlive());
+ }
+ }
}