【问题标题】:Why is my Thread making my JavaFX Application lag?为什么我的线程使我的 JavaFX 应用程序滞后?
【发布时间】:2014-07-27 21:47:44
【问题描述】:

我正在尝试使用控制器类中的此代码创建一个 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();

【问题讨论】:

    标签: java multithreading javafx


    【解决方案1】:

    你所做的是让 Javafx 应用程序线程 Thread.sleep(1000);

    您应该退出 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 接收事件。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        您在将在 UI 线程上执行的 Runnable 中调用 Thread.sleep(long)。如果线程正在休眠,它只能在那里休眠。如果您希望标签每 1000 毫秒更新一次,可以使用 java.util.Timer 类来实现。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-11
          • 1970-01-01
          • 1970-01-01
          • 2020-06-17
          • 1970-01-01
          • 2019-08-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多