当前位置: 首页 > 面试题库 >

JAVAFX:为什么等待游标需要一个新线程?

薛坚
2023-03-14
问题内容

我会明白为什么

 scene.setCursor(Cursor.WAIT);
 long task...
 scene.setCursor(Cursor.DEFAULT);

需要新的线程;它适用于:

private void set_cursore_attesa(final Scene scene)
{
    Runnable r=new Runnable() {

        @Override
        public void run() {
             scene.setCursor(Cursor.WAIT);
        }
    };
    Thread t=new Thread(r);
    t.start();
}
private void set_cursore_normale(final Scene scene)
{
        Runnable r=new Runnable() {

        @Override
        public void run() {
             scene.setCursor(Cursor.DEFAULT);
        }
    };
    Thread t=new Thread(r);
    t.start();
}

in my function:
set_cursore_attesa(scene);
long task...
set_cursore_normale(scene);

为什么我不能使用同一线程?一世:

  1. 将光标设置为WAIT(进入GUI队列)
  2. 做我的长任务…(它进入GUI队列,但我希望光标更改,即在队列中,它在此之前执行)
  3. 将光标重置为默认值(任务完成后)

那么,我的长任务不会进入MAIN队列吗?因为,如果它进入主队列,我希望它在我的WAIT游标首先插入队列之后执行。为什么会这样呢?


问题答案:

没有线程,您的代码将在FX
Application线程上执行。这是(有效)负责将UI呈现到屏幕并处理用户输入的线程。如果您在此线程上执行了长时间运行的任务,那么您将阻止FX
Application Thread的任何正常功能发生,直到您完成长时间运行的任务。特别是如果

scene.setCursor(Cursor.WAIT);
longRunningTask();
scene.setCursor(Cursor.DEFAULT);

然后将按照您指定的顺序进行设置, 但是直到所有代码行都完成后,场景才会重新渲染 。因此,直到代码完成后,您才真正看到UI的任何更改-
包括光标的更改。下次FX Application Thread有机会渲染场景时,光标设置为Cursor.DEFAULT,您将永远看不到等待光标。

对于多线程和JavaFX,有两个基本规则(相同的规则通常适用于大多数UI工具包):

  1. 对UI的任何更改都 必须 在FX Application线程上执行
  2. 不应 在FX Application Thread上执行长时间运行的进程(因为它们会使UI无响应)

因此,您的解决方案实际上并不正确,因为您违反了这两个规则。你应该

  1. 将光标设置在WAITFX Application线程上
  2. 在后台线程上启动长期运行的任务
  3. 任务完成后DEFAULT,在FX Application Thread上将光标设置回。

您可以使用Task

scene.setCursor(Cursor.WAIT);
Task<Void> task = new Task<Void>() {
    @Override
    public Void call() {
        // long running task here...
        return null ;
    }
};
task.setOnSucceeded(e -> scene.setCursor(Cursor.DEFAULT));
new Thread(task).start();


 类似资料:
  • 在下面的代码中,为什么主线程要等到子线程完成。 Driver.java ThreadRunner.java 调用“t.start()”后,在驱动程序类中,程序是否应该退出?我没有使用join,但主线程仍在等待,直到新旋转的“ThreadRunner”运行开始。这是因为在java中,主线程(由main方法启动)总是等待所有线程关闭吗?

  • 问题内容: 为什么线程不等待?线程启动,然后进入等待池,但是在那一刻之后它将继续执行。 问题答案: 您正在线程对象本身上进行同步,这是错误的用法。即将发生的事情是,即将死去的执行线程总是调用其对象: 依赖于this。因此,很清楚为什么在其中有或没有自己的情况下都会得到相同的行为。 解决方案:使用单独的对象进行线程协调;这是标准做法。

  • 考虑以下代码: 这是我得到的输出: 但是如果我把代码改成这样: 我会得到这个: 我很困惑,因为根据文档,应该暂停执行,直到promise得到解决。在这种情况下,第一个示例应该以数组的形式返回

  • 问题内容: 说你有这个代码 我的问题是,为什么您需要在此处进行while循环。 pthread_cond_wait* 不会只等到信号线程发出 cam_video_cond 信号吗?好的,我知道您可能会遇到以下情况:调用 pthread_cond_wait 时 cam- > status不等于 WAIT_DISPAY ,但是在那种情况下,您可以通过 if 条件检查它,而不是使用 while 。 *

  • 我的问题得到了回答,我的问题得到了解决。我已经更新了这个线程与我的最终解决方案 我正在做这个学校作业(测验程序),我们最初只需要做一个纯粹的基于文本的控制台游戏,但我想挑战自己,试着用JavaFX创建它,我们刚刚开始学习。 这是一个基于回合的问答游戏,玩家将被呈现一个问题,要求玩家通过两个按钮(对或错按钮)回答对/错 游戏流程: 我正在运行一个for循环,只要我的ArrayList中还有问题,这个

  • 所以我有这样的东西: 一切都很好,直到我不得不等待其他事情完成,然后才能继续运行,所以我这样修改了它: 后来我做了这样的事情: 现在,我的gui在切换场景时开始滞后 - 这意味着 - 整个thread1自行处理,然后gui加载所有内容。经过一些研究,我认为发生这种情况是因为主线程正在处理runLater“请求”,并且由于wait(),主线程必须等到第一个辅助线程来到CountDown()。 我的问