Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是SwingUtilities.invokeLater(新的Runnable())_Java_Swing - Fatal编程技术网

Java 什么是SwingUtilities.invokeLater(新的Runnable())

Java 什么是SwingUtilities.invokeLater(新的Runnable()),java,swing,Java,Swing,谁能用简单的话向我解释一下这段代码: SwingUtilities.invokeLater( new Runnable(){ public void run(){ chatWindow.append(text); } }); } 请给我一个详细的解释。Runnable是一个Java接口,表示定义run方法的类型。实现可运行接口的类必须为其提供实现。线程是众所周知的可运行线程 从: 导致在AWT事件上异步执行doRun.ru

谁能用简单的话向我解释一下这段代码:

SwingUtilities.invokeLater(
    new Runnable(){
        public void run(){
            chatWindow.append(text);
        }
    });
}

请给我一个详细的解释。

Runnable
是一个Java接口,表示定义run方法的类型。实现可运行接口的类必须为其提供实现。线程是众所周知的可运行线程

从:

导致在AWT事件上异步执行doRun.run() 调度线程。这将在所有挂起的AWT事件发生后发生 已经处理过了。当应用程序线程 需要更新GUI。在下面的示例中,调用调用器调用 将可运行对象doHelloWorld在事件调度上排队 线程,然后打印一条消息

如果从事件调度线程调用invokeLater——对于 例如,从JButton的ActionListener——doRun.run()仍将 将延迟到处理完所有挂起的事件


Runnable
是Java中的一个接口,表示定义运行方法的类型。实现可运行接口的类必须为其提供实现。线程是众所周知的可运行线程

从:

导致在AWT事件上异步执行doRun.run() 调度线程。这将在所有挂起的AWT事件发生后发生 已经处理过了。当应用程序线程 需要更新GUI。在下面的示例中,调用调用器调用 将可运行对象doHelloWorld在事件调度上排队 线程,然后打印一条消息

如果从事件调度线程调用invokeLater——对于 例如,从JButton的ActionListener——doRun.run()仍将 将延迟到处理完所有挂起的事件


这是一种将一定数量的指令传递给AWT事件调度线程(EDT)的方法。这是必需的,因为从其他线程操作AWT相关的东西(比如JFrames及其所有子线程)是不好的做法。你最好把它交给EDT,让它在适当的时候处理


代码本身使用一个实现Runnable的匿名类,以便让您指定要在EDT上执行的内容。可运行接口要求您实现
run()
方法。然后,EDT将在需要时调用类对象
run()

这是一种向AWT事件调度线程(EDT)传递一定数量指令的方法。这是必需的,因为从其他线程操作AWT相关的东西(比如JFrames及其所有子线程)是不好的做法。你最好把它交给EDT,让它在适当的时候处理

代码本身使用一个实现Runnable的匿名类,以便让您指定要在EDT上执行的内容。可运行接口要求您实现
run()
方法。然后,EDT将在需要时调用类对象
run()

答案:

基本上,当所有AWT事件被使用时,它会在内嵌
Runnable
对象的
run()方法中启动代码。

答案:


基本上,当所有AWT事件被使用时,它会在内嵌的
Runnable
对象的
run()
方法中启动代码。

您正在创建
Runnable
接口的匿名实现的实例,并将其传递给
invokeLater
,这将把它放到队列中。另一个线程,事件调度线程,将Runnables弹出该队列并调用它们的
run
方法。(请注意,这确实是一个过于简单的解释,与现实并不完全相符。)

就程序员感兴趣的效果而言,以下代码行:

chatWindow.append(text);

不是在当前线程上执行,而是在事件调度线程(EDT)上执行。如果您试图在当前线程上执行它,则会导致未定义的行为,因为Swing不是线程安全的,所有GUI操作都必须在提到的EDT上进行。

您正在创建
Runnable
接口的匿名实现的实例,并将其传递给
invokeLater
,这将使它进入队列。另一个线程,事件调度线程,将Runnables弹出该队列并调用它们的
run
方法。(请注意,这确实是一个过于简单的解释,与现实并不完全相符。)

就程序员感兴趣的效果而言,以下代码行:

chatWindow.append(text);

不是在当前线程上执行,而是在事件调度线程(EDT)上执行。如果您试图在当前线程上执行它,将导致未定义的行为,因为Swing不是线程安全的,所有GUI操作都必须在提到的EDT上进行。

虽然这些链接上没有什么好的答案和解释,但我仍在添加一些细节:

Swing事件处理代码在称为事件分派线程(EDT)的特殊线程上运行。大多数调用Swing方法的代码也在此线程上运行。这是必要的,因为大多数Swing对象方法都不是线程安全的。在所有与GUI相关的任务中,在EDT上必须进行绘制过程时,应对GUI进行任何更新,这涉及将请求包装在事件中并将其处理到EventQueue上。然后,事件从同一队列中一个接一个地调度,顺序是先入先出。也就是说,如果事件A在事件B之前排队到事件队列,那么事件B将不会在事件A之前调度

SwingUtilities类有两个有用的函数来帮助执行GUI渲染任务:

1) invokeLater(Runnable):导致在AWT事件调度线程(EDT)上异步执行doRun.run()。这将在所有挂起的AWT事件都已处理后发生