如果我们在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));
答案 0 :(得分:1)
我想,jlbFib
是JLabel
,FibComputer
旨在在与事件派发线程不同的某个线程上运行。
javax.swing
的包描述说:
所有Swing组件和相关类,除非另有说明, 必须在事件派发线程上访问。
jlbFib.setText()
电话是一种访问权限,因此它已正确包含在SwingUtilities.invokeLater(...)
中。
如果您不这样做,您可能会遇到任何类型的线程安全问题。通常,在90%的情况下,一切都会看起来很好,有时标签不能正确更新,有时候你的布局可能会崩溃,或者你的GUI甚至可能完全冻结。
答案 1 :(得分:0)
从Oracle docs,在Swing程序中,最初的主题没有太多事情可做。他们最重要的工作是创建一个Runnable
对象,初始化GUI并安排该对象在事件派发线程上执行。创建GUI后,程序主要由GUI事件驱动,每个事件都会导致在事件调度线程上执行短任务。
应用程序代码可以在事件分派线程上安排其他任务(如果它们快速完成,以免干扰事件处理)或工作线程(对于长时间运行的任务)。
初始线程通过调用javax.swing.SwingUtilities.invokeLater
或javax.swing.SwingUtilities.invokeAndWait
来安排GUI创建任务。
这两种方法都只使用一个参数:定义新任务的Runnable
。他们唯一的区别在于他们的名字:invokeLater
只是安排任务并返回; invokeAndWait
在返回之前等待任务完成。
说到你的观点,我相信你的申请是swing
申请。如果您没有使用invokeLater
方法,那么您将如何创建和初始化Runnable
对象,因为通过为Runnable
创建对象意味着您定义了一个新任务,即将进行执行run()
方法。