# HG changeset patch # User asmotrak # Date 1471973881 25200 # Node ID bd0d32b35eab29d03956d39dd384b4d8be87a1f7 # Parent bc3e5bbcb65e8522035724d7bf5ece5473dc2a45 8164159: java/nio/file/WatchService/UpdateInterference.java test leaves daemon threads Reviewed-by: alanb diff -r bc3e5bbcb65e -r bd0d32b35eab jdk/test/java/nio/file/WatchService/UpdateInterference.java --- a/jdk/test/java/nio/file/WatchService/UpdateInterference.java Tue Aug 23 10:32:14 2016 -0700 +++ b/jdk/test/java/nio/file/WatchService/UpdateInterference.java Tue Aug 23 10:38:01 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,9 @@ import static java.nio.file.StandardWatchEventKinds.*; public class UpdateInterference { + + private static volatile boolean stop; + public static void main(String[] args) throws IOException, InterruptedException { final Path root = Files.createTempDirectory("test"); final Path foo = root.resolve("foo"); @@ -43,64 +46,89 @@ Files.createDirectory(bar); Files.createDirectory(baz); - final WatchService watcher = root.getFileSystem().newWatchService(); - final WatchKey fooKey = foo.register(watcher, ENTRY_CREATE); - final WatchKey barKey = bar.register(watcher, ENTRY_CREATE); + try (final WatchService watcher = root.getFileSystem().newWatchService()) { + final WatchKey fooKey = foo.register(watcher, ENTRY_CREATE); + final WatchKey barKey = bar.register(watcher, ENTRY_CREATE); + + Thread t1 = null; + Thread t2 = null; + try { + t1 = new Thread() { - new Thread() { - { setDaemon(true); } + @Override + public void run() { + while (!stop) { + try { + final Path temp = Files.createTempFile(foo, "temp", ".tmp"); + Files.delete(temp); + Thread.sleep(10); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } + } + }; + + t2 = new Thread() { - @Override - public void run() { - while (true) { - try { - final Path temp = Files.createTempFile(foo, "temp", ".tmp"); - Files.delete(temp); - Thread.sleep(10); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); + @Override + public void run() { + WatchKey bazKeys[] = new WatchKey[32]; + while (!stop) { + try { + for( int i = 0; i < bazKeys.length; i++) { + bazKeys[i] = baz.register(watcher, ENTRY_CREATE); + } + for( int i = 0; i < bazKeys.length; i++) { + bazKeys[i].cancel(); + } + Thread.sleep(1); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } } + }; + + t1.start(); + t2.start(); + + long time = System.currentTimeMillis(); + while ((System.currentTimeMillis() - time) < 15000) { + final WatchKey key = watcher.poll(60, TimeUnit.SECONDS); + if (key == null) continue; + + if (key != fooKey) { + List> pollEvents = key.pollEvents(); + for (WatchEvent watchEvent : pollEvents) { + System.out.println(watchEvent.count() + " " + + watchEvent.kind() + " " + + watchEvent.context()); + } + throw new RuntimeException("Event received for unexpected key"); + } + key.reset(); + } + } finally { + // the threads should stop before WatchService is closed + // to avoid ClosedWatchServiceException + stop = true; + + // wait for threads to finish + if (t1 != null) { + t1.join(); + } + + if (t2 != null) { + t2.join(); } } - }.start(); - - new Thread() { - { setDaemon(true); } - - @Override - public void run() { - WatchKey bazKeys[] = new WatchKey[32]; - while (true) { - try { - for( int i = 0; i < bazKeys.length; i++) { - bazKeys[i] = baz.register(watcher, ENTRY_CREATE); - } - for( int i = 0; i < bazKeys.length; i++) { - bazKeys[i].cancel(); - } - Thread.sleep(1); - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - } - } - }.start(); - - long time = System.currentTimeMillis(); - while ((System.currentTimeMillis() - time) < 15000) { - final WatchKey key = watcher.poll(60, TimeUnit.SECONDS); - if (key == null) continue; - - if (key != fooKey) { - List> pollEvents = key.pollEvents(); - for (WatchEvent watchEvent : pollEvents) { - System.out.println(watchEvent.count() + " " + - watchEvent.kind() + " " + - watchEvent.context()); - } - throw new RuntimeException("Event received for unexpected key"); - } - key.reset(); + } finally { + // clean up + Files.delete(foo); + Files.delete(bar); + Files.delete(baz); + Files.delete(root); } } }