Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA SynchronousQueue多线程帮助查看一个目录,可以';不要强迫超时_Java_Multithreading_Concurrency_Synchronization - Fatal编程技术网

JAVA SynchronousQueue多线程帮助查看一个目录,可以';不要强迫超时

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

我有一个JavaFX应用程序,它监听目录以显示文件。我创建了一个单独的线程和一个SynchronousQueue来处理主线程和为侦听目录而创建的线程之间的通信,因此我的应用程序在轮询WatchKey事件的循环中不会挂起。下面是WitchDir类的一个示例,它监视目录

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();           
}