(Java 7 NIO.2)监视服务线程的自定义名称

6
在Java 7中使用nio.2,当你创建一个类似于以下的监视服务时:
WatchService watcher = FileSystems.getDefault().newWatchService();

随后,将启动一个后台线程,在无限循环中轮询文件系统事件。该线程的名称为“Thread-n”,但在调查线程转储或进行分析时,这有点麻烦。

我们能否更改该线程的名称?


你为什么担心WatchService会成为一个问题呢? - Sotirios Delimanolis
没有理由。这就是为什么在调查线程转储时,我希望在识别出观察服务线程的名称后立即将其放在一边。 - Antoine CHAMBILLE
如果你不认识它,那么忽略它怎么样? - Sotirios Delimanolis
我将不承认这条评论 ;) - Antoine CHAMBILLE
1
好问题。如果你深入了解API,你会发现WatchService是一个接口,而FileSystem.newWatchService是抽象的。我还没有深入研究代码,但乍一看似乎不可能更改线程名称...除非你提供自己的FileSystem实现? - fge
1个回答

2

从实现角度来看,似乎不可能直接完成。如果您不介意进行一些小的修改,可以找到该线程并重命名它。

类似这样(//TODO:放置错误检查):

Set<Thread> threadsBefore = Thread.getAllStackTraces().keySet();
WatchService ws = FileSystems.getDefault().newWatchService();

//I don't need to wait here on my machine but YMMV

Set<Thread> threadsAfter = Thread.getAllStackTraces().keySet();
threadsAfter.removeAll(threadsBefore);
Thread wsThread = threadsAfter.toArray(new Thread[1])[0];

System.out.println("wsThread = " + wsThread);

wsThread.setName("WatchService Thread");

Set<Thread> justChecking = Thread.getAllStackTraces().keySet();
System.out.println("justChecking = " + justChecking);

1
我喜欢这种精神 ;)但即使对我来说,它也有点脏。在高度多线程的环境中,在堆栈收集之间可能会添加/删除多个线程... - Antoine CHAMBILLE
1
@AntoineCHAMBILLE 由于每个WatchService实现都是JDK/操作系统特定的,并且它们不提供对其线程的访问,所以恐怕你无法做得更好了... - assylias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接