java-如何在MVC架构中使用线程?

我的一个实现类中的方法需要很长时间才能完成,并且使我的视图冻结.因此,这些方法必须是线程化的!

所有这些方法都使用HashMaps或Lists返回数据.

我的控制器正在通过调用它们来获取数据,然后将它们传递给View.

我不知道应该在哪里创建线程.
它应该在Controller层中还是在实现类中(以及因为我那里有很多方法而如何).

另外,我仅在线程工作完成时才需要刷新视图.
这些方法将被重新调用.

我真的迷失了所遇到的所有线程技术.

控制器:

SomeParser someParser = new FirstParserImpl();

HashMap<String,String> map = someParser.parseSomething();
loadTableView(map);

FirstParserImpl:

public HashMap<String,String> parseSomething() {
    //opening http connection, scrape and parse data. This takes long time!
    return map;
}

解决方法:

使用Task.您可以直接在控制器类中执行此操作:

Task<Map<String, String>> parseDataTask = new Task<Map<String, String>>() {

    @Override
    public Map<String, String> call() {
        SomeParser someParser = new FirstParserImpl();
        return someParser.parseSomething();
    }
};

parseDataTask.setOnSucceeded(e -> {
    Map<String,String> parseResults = parseDataTask.getValue();
    // update UI here with parseResults, e.g:
    loadTableView(parseResults);
});

Thread t = new Thread(parseDataTask);
t.setDaemon(true);
t.start();
上一篇:JavaFX Controller未初始化UI字段


下一篇:更改JavaFX MediaPlayer的播放速度