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

(Java7NIO.2)监视服务线程的自定义名称,java,nio,java-7,Java,Nio,Java 7,在Java7中使用nio.2,当您创建这样的监视服务时: WatchService watcher = FileSystems.getDefault().newWatchService(); 然后,启动一个后台线程,在无限循环中轮询文件系统事件。此线程的名称为“thread-n”,这在调查线程转储或分析会话期间有点麻烦 我们可以更改该线程的名称吗?看看实现,似乎不可能直接更改。如果您不介意稍微修改一下,您可以找到该线程并将其重命名 类似于(//TODO:put error checks in

在Java7中使用nio.2,当您创建这样的监视服务时:

WatchService watcher = FileSystems.getDefault().newWatchService();
然后,启动一个后台线程,在无限循环中轮询文件系统事件。此线程的名称为“thread-n”,这在调查线程转储或分析会话期间有点麻烦


我们可以更改该线程的名称吗?

看看实现,似乎不可能直接更改。如果您不介意稍微修改一下,您可以找到该线程并将其重命名

类似于(//TODO:put error checks in place):

Set threadsBefore=Thread.getAllStackTraces().keySet();
WatchService ws=FileSystems.getDefault().newWatchService();
//我不需要在我的机器上等,但是
设置threadsAfter=Thread.getAllStackTraces().keySet();
移除所有螺纹后的螺纹(之前的螺纹);
线程wsThread=threadsAfter.toArray(新线程[1])[0];
System.out.println(“wsThread=“+wsThread”);
setName(“WatchService线程”);
设置justChecking=Thread.getAllStackTraces().keySet();
System.out.println(“justChecking=“+justChecking”);

您是否有理由担心WatchService出现问题?没有理由。这就是为什么在调查线程转储时,我希望在识别出watch服务线程的名称后,能够立即将其放在一边。相反,如果不识别它,请忽略它。我不会识别此注释;)好问题。如果深入研究API,您可以看到
WatchService
是一个接口,而
文件系统
.newWatchService
是抽象的。我还没有深入研究代码,但乍一看似乎不可能更改线程名称。。。除非您提供自己的
文件系统
实现?我喜欢spirit;)但即使对我来说也有点脏。在一个高度多线程的环境中,在堆栈集合之间可能会添加/删除多个线程…@AntoineChambile因为每个WatchService实现都是特定于JDK/OS的,而且它们不允许访问它们的线程,我认为恐怕你做得不会更好。。。
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);