首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件驱动线程

事件驱动线程
EN

Stack Overflow用户
提问于 2011-03-17 20:30:29
回答 2查看 905关注 0票数 1

我经常看到这样的代码片段:

代码语言:javascript
复制
{

 SwingUtilities.invokeLater(new Runnable()
   {
   public void run() {
     new tester();  // class name
   }
 });

}

我知道我们为什么要使用它,但我不能理解它是如何进行的。我的意思是,我不理解这个片段。

(我们正在初始化run方法下的对象,,,为什么??)

请解释一下这个

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-17 20:36:41

有了这段代码,您将创建一个实现RunnableInner Class,该实例将在AWT处理任务分派器中排队,以便稍后在线程中进行处理。引用文档,invokeLater ...

使doRun.run()在AWT事件调度线程上异步执行。这将在处理完所有挂起的AWT事件后发生。

因此,在某个时刻,AWT调度程序将决定在线程中运行该Runable实例。这将引发方法run的执行,从而导致语句new tester();的执行,该语句只是创建类tester的一个实例。

关于你的具体问题...

我们正在初始化run方法下的对象,,,为什么??

仅仅在run方法中创建一个类似乎是不正确的,除非构造函数正在做很多事情,这实际上是一种糟糕的做法。

这样做要直观得多:

代码语言:javascript
复制
SwingUtilities.invokeLater(new Runnable()
   {
   public void run() {
     Tester t = new Tester();
     t.doSomeStuff();
   }
 });
票数 3
EN

Stack Overflow用户

发布于 2011-03-17 21:16:57

这是在专用线程中注入一些代码的经典方法。AWT不是线程安全的(就像所有UI工具包一样),因此处理AWT的所有代码都必须在一个特定的线程中执行,即事件分派线程( Event Dispatch thread,EDT)。

要做到这一点,AWT需要在EDT中调用一个“代码片段”队列:EventQueue。EDT只是一个循环,它将下一段要执行的“代码”出队并运行它。这些“代码片段”实际上只是Runnable实例。这些可以是UI事件(鼠标、键盘),也可以是您作为开发人员提供给他的代码。

调用invokeLater只是告诉EDT将一个Runnable实例加入到它的EventQueue中。您排队的runnable将在EDT中执行(或者更准确地说,将在EDT中执行它的run方法),此时将轮到它。

这种将代码从一个线程传递到另一个线程的方法非常常见和有用:它是序列化来自不同线程的代码片段的一种很好的方法。唯一需要线程安全的是队列本身。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5339025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档