代码之家  ›  专栏  ›  技术社区  ›  DillibabuSripriya

将FileWatcher与多线程结合使用

  •  1
  • DillibabuSripriya  · 技术社区  · 7 年前

    添加代码段:

    while(true) {
                WatchKey key;
                try {
                    key = watcher.take();
                    Path dir = keys.get(key);
                    for (WatchEvent<?> event: key.pollEvents()) {
                        WatchEvent.Kind<?> kind = event.kind();
                        if (kind == StandardWatchEventKinds.OVERFLOW) {
                            continue;
                        }
                        if(kind == StandardWatchEventKinds.ENTRY_CREATE){
                            boolean valid = key.reset();
                            if (!valid) {
                                break;
                            }
                            log.info("New entry is created in the listening directory, Calling the FileProcessor");
                            WatchEvent<Path> ev = (WatchEvent<Path>)event;
                            Path newFileCreatedResolved = dir.resolve(ev.context());
                            try{
                            FileProcessor processFile = new FileProcessor(newFileCreatedResolved.getFileName().toString());
                            Future<String> result = executor.submit(processFile);
                                try {
                                    System.out.println("Processed File" + result.get());
                                } catch (ExecutionException e) {
                                    e.printStackTrace();
                                }
                            //executor.shutdown(); add logic to shut down
                            }   
                        }
                    }
                }
            }
    

    和FileProcessor类

    public class FileProcessor implements Callable <String>{
        FileProcessor(String triggerFile) throws FileNotFoundException, IOException{
            this.triggerFile = triggerFile;
        }
        public String call() throws Exception{
            //logic to write to another file, this new file is specific to the input file
            //returns success
        }
    

    现在发生了什么->如果我一次传输3个文件,它们是按顺序传输的。首先将文件1写入其目标文件,然后写入文件2、文件3,依此类推。

    1 回复  |  直到 7 年前
        1
  •  0
  •   erickson    7 年前

    呼叫 Future.get()

    包裹你的 Executor 在一个 CompletionService submit() 完成服务 在任务完成后执行任何必要的处理。

    CompletableFuture 建立等效的行动管道。

    第三个更简单但可能不太灵活的选择是将后处理合并到任务本身中。我 demonstrated 一个简单的任务包装器,展示了如何实现这一点。