JAVA SynchronousQueue多线程帮助查看一个目录,可以';不要强迫超时
我有一个JavaFX应用程序,它监听目录以显示文件。我创建了一个单独的线程和一个SynchronousQueue来处理主线程和为侦听目录而创建的线程之间的通信,因此我的应用程序在轮询WatchKey事件的循环中不会挂起。下面是WitchDir类的一个示例,它监视目录JAVA SynchronousQueue多线程帮助查看一个目录,可以';不要强迫超时,java,multithreading,concurrency,synchronization,Java,Multithreading,Concurrency,Synchronization,我有一个JavaFX应用程序,它监听目录以显示文件。我创建了一个单独的线程和一个SynchronousQueue来处理主线程和为侦听目录而创建的线程之间的通信,因此我的应用程序在轮询WatchKey事件的循环中不会挂起。下面是WitchDir类的一个示例,它监视目录 public class WatchDir extends Thread { public static SynchronousQueue<String> syncQueue = new SynchronousQ
public class WatchDir extends Thread {
public static SynchronousQueue<String> syncQueue = new SynchronousQueue<String>();
@Override
public void run(){
boolean continue = true;
while(continue) {
// wait for key to be signalled
WatchKey key;
try {
key = watcher.take();
} catch (InterruptedException x) {
return;
}
for (WatchEvent<?> event: key.pollEvents()) {
Kind<?> kind = event.kind();
// Context for directory entry event is the file name of entry
WatchEvent<Path> ev = cast(event);
Path name = ev.context();
Path child = dir.resolve(name);
// TODO: handle OVERFLOW event??
if (kind == OVERFLOW) {
continue;
}else if(kind == ENTRY_CREATE){
if(name.endsWith(type.getFileName())){
//do stuff...i.e. parse the file contents into csv
try{
syncQueue.put("csv string");
}catch(InterruptedException iex){
iex.printStackTrace();
break;
}
}
etc...
你为什么要使用这种自制的、低效的投票?Java有一个用于观察目录的内置机制。
我看不到您的代码从顶部断开,而循环是无限的,因为continue总是正确的,并且不会改变(至少在您发布的代码中不会)。
try{
watchDir = new WatchDir(WATCHDIR, false, MercG_PWS);
watchDir.start();
String result = "";
//I don't think the following loop is correct....
while(result.isEmpty()){
try{
result = WatchDir.syncQueue.poll(15, TimeUnit.SECONDS);
}catch(InterruptedException iex){
Log.errorDialog(Log.MODERATE, "timed out.", false);
watchDir.interrupt();
break;
}
}
}catch(IOException iox){
iox.printStackTrace();
}