我经常遇到这个片段:
{
SwingUtilities.invokeLater(new Runnable()
{
public void run() {
new tester(); // class name
}
});
}
我知道为什么我们使用它,但无法理解它是怎么回事。我的意思是我不理解这个片段。
(我们在run方法下初始化对象,,,为什么??)
请解释一下
答案 0 :(得分:3)
使用该位代码创建一个实现Inner Class
的{{1}},该实例将在AWT处理任务调度程序中排队,以便稍后在线程中处理。引用文档Runnable
...
导致执行doRun.run() 在AWT事件上异步 调度线程。这将发生 在所有未决的AWT事件发生之后 处理。
因此,在某些时候,AWT调度程序将决定在一个线程中运行Runable的该实例。这将激发方法invokeLater
的执行,从而执行语句run
,它只是创建类new tester();
的实例。
针对您的具体问题......
我们正在初始化运行中的对象 方法,,,为什么?
在tester
方法中创建一个类似乎是不对的,除非构造函数做了很多实际上是不好的事情。
执行以下操作会更直观:
run
答案 1 :(得分:1)
这是在专用线程中注入一些代码的经典方法。 AWT不是线程安全的(因为所有的UI工具包都是),因此所有处理AWT的代码都必须在spoccial线程中执行,即Event Dispatch Thread(EDT)。
为此,AWT在EDT中有一段“代码片段”:EventQueue。 EDT只是一个循环,它将下一个要执行的“代码段”出列,然后运行它。这些“代码片段”实际上只是Runnable
个实例。这些可以是您作为开发人员给他的UI事件(鼠标,键盘)或代码。
致电invokeLater
只是告诉EDT将Runnable
实例排入其EventQueue
。你排队的可运行的东西将在EDT中被执行(或者更确切地说,它将被执行run
方法),当轮到它时。
这种将代码从一个线程传递到另一个线程的方式非常常见且有用:它是序列化来自不同线程的代码片段的好方法。唯一需要线程安全的是队列本身。