如果我们没有在java中使用invokeLater方法,会发生什么
谁能给我举一个例子,说明如果我们不在Java中使用如果我们没有在java中使用invokeLater方法,会发生什么,java,Java,谁能给我举一个例子,说明如果我们不在Java中使用invokeLater()方法会发生什么 class FibComputer implements Runnable{ public void run(){ final int result = fib(47); SwingUtilities.invokeLater(new Runnable(){ public void run(){ jlbFib.s
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));
在Swing程序中,初始线程没有很多事情要做。他们最重要的工作是创建一个Runnable
对象,该对象初始化GUI并计划在事件调度线程上执行该对象。创建GUI后,程序主要由GUI事件驱动,每个事件都会导致在事件调度线程上执行一个短任务。
应用程序代码可以在事件分派线程(如果它们很快完成,以避免干扰事件处理)或工作线程(对于长时间运行的任务)上安排其他任务
初始线程通过调用javax.swing.SwingUtilities.invokeLater
或javax.swing.SwingUtilities.invokeAndWait
来调度GUI创建任务。
这两种方法都使用一个参数:定义新任务的Runnable
。它们唯一的区别在于它们的名称:invokeLater
只是调度任务并返回invokeAndWait
等待任务完成后返回。
说到您的观点,我相信您的应用程序是
swing
应用程序。如果您没有使用invokeLater
方法,那么您将如何创建和初始化Runnable
对象,因为为Runnable
创建对象意味着您要定义一个新任务,即执行run()
方法。jlbFib
我想是一个JLabel
,而FibComputer
打算在与事件调度线程不同的线程上运行
javax.swing
的软件包说明如下:
所有Swing组件和相关类别,除非另有说明,
必须在事件调度线程上访问
jlbFib.setText()
调用就是这样一种访问,因此它正确地包装在SwingUtilities.invokeLater(…)
中
如果不这样做,您可能会遇到任何类型的线程安全问题。通常,在90%的情况下,一切看起来都很好,有时标签无法正确更新,有时布局可能会崩溃,或者GUI可能会完全冻结。好吧,如果您只是尝试一下,会发生什么?什么是
jlbFib
?我们怎么知道它是做什么的?run方法不会被调用?