使用Executor批处理任务

时间:2012-05-21 07:11:44

标签: java batch-file javafx-2 executorservice

我想批处理一堆任务(更新GUI)并每秒运行一次。 (我每秒钟有数百次更新,导致Java FX 2冻结)

    public void update(String price){
        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                priceLabel.setText(price);

            }});
    }

在Java中最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

通常,对GUI的所有更新都会一起批处理并在GUI线程中处理。我认为你的架构是你真正的问题。每10毫秒更换一次标签是不明智的。即使Java FX支持这一点,用户唯一会看到的是闪烁。因此,我建议您更新内部数据模型,并以特定时间速率对用户显示数据模型的更改。您的数据模型将独立于您的用户界面,后台线程可以每2秒左右向您的用户界面提交一次更新。

答案 1 :(得分:0)

是什么触发了变化?如果文本链接到某个对象的值you could use binding,则在对象的值发生变化时自动更新GUI。

或者,您可以尝试手动执行此操作。例如,请参阅下面的代码(这是简单的 - 您可能需要在运行runnables时清除列表以避免运行它们两次 - 在这种情况下,您需要处理并发问题等):

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final List<Runnable> list = new CopyOnWriteArrayList<Runnable>(); //your updates
Runnable updateGui = new Runnable() {

    @Override
    public void run() {
        Platform.runLater(new Runnable() {

            @Override
            public void run() {
                for (Runnable r : list) {
                    r.run();
                }
            }
        });
    }
};

scheduler.scheduleAtFixedRate(updateGui, 0, 1, TimeUnit.SECONDS);

list.add(new Runnable() {

    @Override
    public void run() {
        priceLabel.setText(price);
    }
});