首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何终止监视服务线程

如何终止监视服务线程
EN

Stack Overflow用户
提问于 2016-12-16 05:59:10
回答 1查看 1K关注 0票数 1

我有一个根据我的UI的请求来观看HotFolder的要求我的UI上有启动和停止按钮,当我点击start时,我的代码应该观看文件夹,点击stop它应该停止观看它。我正在使用监视服务来监视HotFolder,我正在从我的控制器向监视服务传递标志,以启动和停止监视文件夹。请建议我怎样才能不再看文件夹?

以下是代码片段:

代码语言:javascript
复制
@RequestMapping(value = "/start", method = RequestMethod.GET)
public ModelAndView hotFolder()
{
    ModelAndView model = new ModelAndView();
    model.setViewName("welcomePage");

    HotFolder h = new HotFolder();
    h.hotfolderTesting(true);
    return model;
} 

@RequestMapping(value = "/stop", method = RequestMethod.POST)
public ModelAndView hotFolderStop()
{
    ModelAndView model = new ModelAndView();
    model.setViewName("welcomePage");

    HotFolder h = new HotFolder();
    h.hotfolderTesting(false);
    return model;
}

HotFolder.java:

代码语言:javascript
复制
public void hotfolderTesting(boolean flag)
{
    try (WatchService service = FileSystems.getDefault().newWatchService()) {
        Map<WatchKey, Path> keyMap = new HashMap<>();
        Path path = Paths.get("E:\\TestingWatch");
        keyMap.put(path.register(service, StandardWatchEventKinds.ENTRY_CREATE), path);

        WatchKey watchKey;
        if (flag) {
            while (true) {
                watchKey = service.take();
                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                        System.out.println("Created: " + event.context());
                    } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                        System.out.println("Deleted: " + event.context());
                    } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                        System.out.println("Modified :" + event.context());
                    }
                }
                if (!watchKey.reset()) {
                    break;
                }
            }
        }
    } catch (Exception ignored) {
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-12-16 06:27:31

肯定有一些你没有提到的东西,因为我看到的注释让我认为你在使用某种基于REST的库。

无论如何,你的代码永远不会工作。这是因为你基本上是把回答你问题的线程变成了监视线程,而这永远不会完成你的工作。我建议使用Singleto模式,像这样编写您的HotFolder类:

代码语言:javascript
复制
public class HotFolder implements Runnable{
    private static HotFolder instance = null;

    public static HotFolder getInstance(){
        if(instance == null)
            instance = new HotFolder();
        return instance;
    }

    private boolean running = false;
    private Thread t = null
    private HotFolder(){
    }

    public setRunning(boolean running){
        this.running = running;
        if(running && t == null){
            t = new Thread(this);
            t.start()
        }else if(!running && t!= null){
            t = null;
        }
    }

    public boolean getRunning(){
        return running;
    }

    public void run(){
        try (WatchService service = FileSystems.getDefault().newWatchService()) {
            Map<WatchKey, Path> keyMap = new HashMap<>();
            Path path = Paths.get("E:\\TestingWatch");
            keyMap.put(path.register(service, StandardWatchEventKinds.ENTRY_CREATE), path);
            WatchKey watchKey;
            watchKey = service.take();
            do{
                for (WatchEvent<?> event : watchKey.pollEvents()) {
                    if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                        System.out.println("Created: " + event.context());
                    } else if (event.kind() == StandardWatchEventKinds.ENTRY_DELETE) {
                        System.out.println("Deleted: " + event.context());
                    } else if (event.kind() == StandardWatchEventKinds.ENTRY_MODIFY) {
                        System.out.println("Modified :" + event.context());
                    }
                }
            }while(running && watchKey.reset());
        } catch (Exception ignored) {
        }
    }
}

然后你就会这样叫它

代码语言:javascript
复制
//to activate
HotFolder.getInstance().setRunning(true)
//to stop it
HotFolder.getInstance().setRunning(false)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41174018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档