为什么我的Thread使我的JavaFX应用程序滞后?

时间:2014-07-27 21:47:44

标签: java multithreading javafx

我试图在控制器类中使用此代码创建一个跟踪鼠标移动的JavaFX应用程序:

 new Thread(new Runnable() {
        @Override public void run() {
            while (Main.running) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            label.setText(MouseInfo.getPointerInfo().getLocation().toString());
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }

    }).start();

但它使我的申请延迟了很长时间。 我该如何解决这个滞后问题?

谢谢我修好了:

  new Thread(new Runnable() {
        @Override public void run() {
            while (Main.running) {

                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                         label.setText(MouseInfo.getPointerInfo().getLocation().toString());

                    }
                });
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }).start();

3 个答案:

答案 0 :(得分:2)

您正在做的是让Javafx应用程序线程Thread.sleep(1000);< -wait

任何长期行动你都应该放弃JFX-AT。并且只更新你的ui组件。

new Thread(()->{
while(Main.running){
Platform.runLater(()->{

//updateui component
//this is updating on FXAT

});
Thread.sleep(time)//This way you dont let JFXAT wait
}
}).start();

//不确定格式化和花括号是否正确。希望你能理解。确定你知道哪个线程让你等待。否则你将无法接收暂停的jfxat中的事件。

答案 1 :(得分:0)

您应该将Thread.sleep()调用放入while循环而不是Runnable,否则循环会不断发布大量runLater任务,这些任务会使事件线程停止1000ms更新鼠标位置后

答案 2 :(得分:0)

您在将在UI线程上执行的Runnable中调用Thread.sleep(long)。如果线程处于休眠状态,除了在那里睡觉之外它无法做任何事情。如果您希望标签每1000毫秒更新一次,则可以使用java.util.Timer类来实现。