如果我们在java中不使用invokeLater方法会发生什么

时间:2018-01-04 10:19:03

标签: java

如果我们在Java中不使用invokeLater()方法,有人能告诉我一个例子吗?

class FibComputer implements Runnable{
    public void run(){
        final int result = fib(47);
        SwingUtilities.invokeLater(new Runnable(){
            public void run(){
                jlbFib.setText(String.valueOf(result));

2 个答案:

答案 0 :(得分:1)

我想,jlbFibJLabelFibComputer旨在在与事件派发线程不同的某个线程上运行。

javax.swing的包描述说:

  

所有Swing组件和相关类,除非另有说明,   必须在事件派发线程上访问。

jlbFib.setText()电话是一种访问权限,因此它已正确包含在SwingUtilities.invokeLater(...)中。

如果您不这样做,您可能会遇到任何类型的线程安全问题。通常,在90%的情况下,一切都会看起来很好,有时标签不能正确更新,有时候你的布局可能会崩溃,或者你的GUI甚至可能完全冻结。

答案 1 :(得分:0)

Oracle docs,在Swing程序中,最初的主题没有太多事情可做。他们最重要的工作是创建一个Runnable对象,初始化GUI并安排该对象在事件派发线程上执行。创建GUI后,程序主要由GUI事件驱动,每个事件都会导致在事件调度线程上执行短任务。 应用程序代码可以在事件分派线程上安排其他任务(如果它们快速完成,以免干扰事件处理)或工作线程(对于长时间运行的任务)。

初始线程通过调用javax.swing.SwingUtilities.invokeLaterjavax.swing.SwingUtilities.invokeAndWait来安排GUI创建任务。  这两种方法都只使用一个参数:定义新任务的Runnable。他们唯一的区别在于他们的名字:invokeLater只是安排任务并返回; invokeAndWait在返回之前等待任务完成。

说到你的观点,我相信你的申请是swing申请。如果您没有使用invokeLater方法,那么您将如何创建和初始化Runnable对象,因为通过为Runnable创建对象意味着您定义了一个新任务,即将进行执行run()方法。