作者sbrhsieh (十年~)
看板java
标题Re: [问题] 利用Thread呼叫JNotify无反应
时间Fri Mar 29 21:31:28 2013
※ 引述《KOFXI ()》之铭言:
: 我推测应该是监测档案的 Thread 已经执行完毕 , 进入结束状态
: 导致根本没有做监测档案的动作
: 所以解决方式是呼叫 addWatch 後加入一个回圈
: 该回圈判断目前Thread是否被中断,如果没有就一直跑无穷回圈
: 所以你可以试着这样改改看(目前我测试是OK的)
: ThreadForJNotify.java
: ----------------------------------------------------------------------
: public void run() {
: try {
: //省略前面资料设定部分....
: int watchID = JNotify.addWatch(path,mask,watchSubtree,new Listener()) ;
: //当外部呼叫该 Thread interrupt() 函式会得到 true
: while(interrupted()) {
: //释放资源
: JNotify.removeWatch(watchID) ;
: }
: }
: catch(Exception e) {
: e.printStackTrace() ;
: }
: }
这段码并没有符合你描述的做法,假如 JNotify.addWatch 不是 blocking 操作,
那麽那个 while loop 一下子就跳离了(由於 thread 原本就不是在 interrupted
状态)。
我想你的意思应该是
public void run() {
int watchID = JNotify.addWatch(path,mask,watchSubtree,new Listener());
while (!Thread.interrupted());
JNotify.removeWatch(watchID);
}
不过不建议这样子做,因为这样子只是徒耗 CPU 运算能力。
如果真有需要延後一个 thread 结束,又不想浪费运算资源,建议透过
synchronization 机制去做。
例如:
public void run() {
int watchID = JNotify.addWatch(path,mask,watchSubtree,new Listener());
synchronized (Thread.currentThread()) {
try {
Thread.currentThread().wait();
}
catch (InterruptedException ex) {}
}
JNotify.removeWatch(watchID);
}
想要停止运行上面 run method 的 thread,可对该 thread 执行 interrupt 或
notify 操作。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.172.233.10
1F:推 KOFXI:欧..这我到没想到 多谢指教啦!! 03/29 22:13
2F:推 KOFXI:刚刚按照你说的测试 进入wait不用notify就可以侦测到了 03/29 22:42
3F:推 rudolf1238:非常感谢你们两位的建议,小弟受益良多,非常谢谢!! 03/30 17:56