これはPath#registerメソッドを参照しています。スレッドがメソッドを含むブロックを実行していて、別のスレッドがそれを事前に中断した場合。次に、メソッドが割り込みステータスをクリアすることがわかります。
ドキュメントのどこにも、スレッドの割り込みステータスをクリアすることが記載されていません。
複製するには
import java.io.*;
import java.nio.file.*;
import static java.nio.file.LinkOption.*;
import static java.nio.file.StandardWatchEventKinds.*;
import java.nio.file.attribute.*;
public class WatchDir {
private final WatchService watcher;
private void register(Path dir) throws IOException {
// interrupt itself
Thread.currentThread().interrupt();
boolean before = Thread.currentThread().isInterrupted();
WatchKey key = dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
boolean after = Thread.currentThread().isInterrupted();
if (before) {
if (!after) {
System.out.println("--------------------BUG-------------------");
System.out.format("Interrupt Status: true before making call to Path#register for folder folder: %s\n", dir);
System.out.format("Interrupt Status: false after making call to Path#register for folder folder: %s\n", dir);
System.out.println("The interrupt status was cleared by `register` (Unexpected Behavior).");
System.exit(0);
} else {
System.out.println("Not a bug on your machine. The interrupt was not cleared after call to Path#register. Works as expected");
System.out.println("Works well on your machine. Didn't work for me on Windows and Ubuntu with Java 7");
}
}
}
/**
* Creates a WatchService and registers the given directory
*/
WatchDir(Path dir) throws IOException {
this.watcher = FileSystems.getDefault().newWatchService();
register(dir);
}
public static void main(String[] args) throws Exception {
// register directory and process its events
Path dir = Paths.get(".");
new WatchDir(dir);
}
}
上記では、関数を呼び出した後に割り込みステータスがクリアされていることがわかりますregister
。出力例:
--------------------BUG-------------------
Interrupt Status: true before making call to Path#register for folder folder: .
Interrupt Status: false after making call to Path#register for folder folder: .
The interrupt status was cleared by `register` (Unexpected Behavior).
この問題は、シャットダウンが要求された後でもサービスがまだアクティブであることが判明したために発生しました。何か案は?
編集: Windows と Linux でのみ発生していることが判明しました。Mac は期待どおりに動作します。私の OS: Win 7 64 ビット。JDK 1.7.0_11。次の場所にもあります: Ubuntu 14.04 Java 1.7.0_45-b18