标签: event-dispatch-thread

Java事件派遣线程说明

我最近开始学习和探索Java中GUI编程的基础知识.

经过一段时间的编程后,我只完成了后端工作或工作,因此最接近用户界面的是命令控制台(我知道这令人尴尬).

我正在使用Swing,据我所知,这意味着我也使用AWT.

我的问题是基于这段代码:

java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
        new frame.setVisible(true);
    }
} );
Run Code Online (Sandbox Code Playgroud)

我一直在研究这一段时间,因为我想完全理解这种奇怪的代码和所遇到的术语"事件派发线程"多次.如果我错了,但正如我所理解的那样纠正我; 它与使用多个线程以及Java Swing如何解释这些线程有关.我也收集到上面的代码用于确保所有线程在创建窗口之前是"安全的",因此invokeLater?

我读过:

"你只能从Event-Dispatching Thread中调用对框架进行操作的方法"

并且只有在某些情况下才能调用main方法对框架进行操作的方法.

有人可以向我澄清一下Event-Dispatching Thread到底是什么吗?

它如何与多个执行线程相关,以及如何从main方法调用这些线程是不安全的?为什么我们需要这个invokeLater?

我们不能像其他任何对象一样创建窗口吗?

我在研究中遇到了一些障碍,因为我没有抓住这些关系和想法.

一个侧面说明,我喜欢将我的知识建立在深入理解的基础上,因为我相信这会带来最好的整体结果,并因此成为最好的计划.如果我深入了解某些东西是如何工作的,那么你可以有效地使用提示和调整,而不仅仅是将它们重新编入代码中,所以请不要害怕给我一些额外的深入解释并扩展我的知识.

谢谢.

java swing awt event-dispatch-thread

54
推荐指数
2
解决办法
3万
查看次数

SwingUtilities.invokeLater

我的问题与此有关SwingUtilities.invokeLater.我应该什么时候使用它?每次需要更新GUI组件时是否必须使用?它到底是做什么的?是否有替代品,因为它听起来不直观,并添加看似不必要的代码?

java swing multithreading awt event-dispatch-thread

52
推荐指数
4
解决办法
3万
查看次数

SwingUtilities.invokeLater做什么?

怎么SwingUtilities.invokeLater办?它只是推迟在其run方法中执行一段代码吗?在invokeLater函数中调用一个动作或者在我们想要执行的线程的末尾调用它有什么区别?任何人都可以帮我完成这项invokeLater功能的真正功能吗?

java swing multithreading awt event-dispatch-thread

38
推荐指数
2
解决办法
5万
查看次数

静态线程分析:好主意?

我帮助维护和构建一个相当大的Swing GUI,有很多复杂的交互.我经常发现自己修复了由于某些其他竞争条件导致事情进入奇怪状态的错误.

随着代码库变大,我发现通过文档指定哪些方法具有线程限制已经不那么一致了:最常见的是必须在Swing EDT上运行的方法.类似地,知道并提供静态感知将是有用的,其中(我们的自定义)侦听器通过规范在EDT上被通知.

因此,我认为这应该可以使用注释轻松实施.请注意,至少存在一个静态分析工具CheckThread,它使用注释来完成此任务.它似乎允许你声明一个方法被限制在一个特定的线程(最常见的是EDT),并将标记尝试调用该方法的方法,而不会将自己声明为局限于该线程.

所以从表面上看,这似乎是对源和构建周期的低痛苦,巨大收益.我的问题是:

  • 对于使用CheckThread或类似库来强制执行线程约束的人来说,是否有任何成功案例?任何失败的故事? 为什么成功/失败?
  • 这在理论上是好的吗? 有理论上的缺点吗?
  • 这在实践中是好的吗? 这值得么? 它提供了什么样的价值?
  • 如果它在实践中有效,那么支持这个的好工具是什么? 我刚刚找到了CheckThread,但承认我并不完全确定我在寻找其他工具来做同样的事情.

我知道它是否适合我们取决于我们的情况.但是我从来没有听说过人们在实践中使用过这样的东西,说实话,它似乎并没有从一些普通的浏览中获得太多.所以我想知道为什么.

java multithreading static-analysis event-dispatch-thread

27
推荐指数
1
解决办法
1095
查看次数

如何捕获事件调度线程(EDT)异常?

我正在使用一个名为MyExceptionHandlerimplements 的类Thread.UncaughtExceptionHandler来处理我的项目中的正常异常.

据我所知,这个类无法捕获EDT异常,所以我尝试在main()方法中使用它来处理EDT异常:

public static void main( final String[] args ) {
    Thread.setDefaultUncaughtExceptionHandler( new MyExceptionHandler() );  // Handle normal exceptions
    System.setProperty( "sun.awt.exception.handler",MyExceptionHandler.class.getName());  // Handle EDT exceptions
    SwingUtilities.invokeLater(new Runnable() {  // Execute some code in the EDT. 
        public void run() {
            JFrame myFrame = new JFrame();
             myFrame.setVisible( true );
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

但直到现在它还没有用.例如,在初始化JFrame时,我从构造函数中的bundle文件加载其标签,如下所示:

setTitle( bundle.getString( "MyJFrame.title" ) );
Run Code Online (Sandbox Code Playgroud)

MyJFrame.title从bundle文件中删除了密钥以测试异常处理程序,但它不起作用!例外通常打印在日志中.

我在这里做错了吗?

java exception try-catch event-dispatch-thread

20
推荐指数
1
解决办法
7031
查看次数

什么时候Event Dispatch Thread开始了?

什么时候开始EDT?什么代码行负责呢?

我的猜测是"someSwingComponent.setVisible(true)"可以解决问题,但我不确定.

谢谢!

java swing event-dispatch-thread

15
推荐指数
1
解决办法
2680
查看次数

EventQueue.isDispatchThread()中的无限循环

我有一个Java程序占用100%的CPU,但似乎什么都不做.

如果我进行线程转储,则有4个线程(在5个池中)等待锁定.

"Incoming WorkPool 5" - Thread t@363
   java.lang.Thread.State: WAITING
    at sun.misc.Unsafe.park(Native Method)
    - waiting to lock <7212149b> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) owned by "Incoming WorkPool 3" t@354
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197)
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214)
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290)
    at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1019)
    at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)
Run Code Online (Sandbox Code Playgroud)

他们正在等待的线程是RUNNABLE

"Incoming WorkPool 3" - Thread t@354
   java.lang.Thread.State: RUNNABLE
    at java.awt.EventQueue.isDispatchThreadImpl(EventQueue.java:1024)
    at java.awt.EventQueue.isDispatchThread(EventQueue.java:1014)
Run Code Online (Sandbox Code Playgroud)

这是JDK 7.0.25,所以似乎有一个线程被卡住了

EventQueue next = eq.nextQueue;
while (next != null) {
    eq = next;
    next = eq.nextQueue;
}
Run Code Online (Sandbox Code Playgroud)

有两个AWT EventQueue线程,试图获得相同的pushpoplock.

VM作为服务运行,所以它不应该尝试做AWT的东西,但它是由我正在使用的库完成的.

有任何想法吗?我可以防止这种情况发生吗?

谢谢!

java swing multithreading awt event-dispatch-thread

15
推荐指数
1
解决办法
877
查看次数

我怎么知道我是否在事件发送线程上?

1.考虑我的代码是在我的JPanel的某些行上,我是否自动在EDT上?

2.对于不属于GUI,JPanels或其他视图类,简单逻辑类的所有其他类的同名问题.

3.如果我有JPanel我正在播放音乐,那么音乐应该在事件发送线程上运行还是在非EDT的其他线程上运行(因为我没有遇到任何运行问题)来自EDT)?

注意:我想要一般规则如何在不使用SwingUtilities.isEventDispatchThread()
Thanks的情况下了解它

java swing javasound jpanel event-dispatch-thread

14
推荐指数
2
解决办法
7677
查看次数

如何停止Swing EDT

典型的Swing应用程序在开始时启动EDT,当最后一个窗口关闭时,Application基本上使用隐式或显式的System.exit停止.

但是我的小应用程序实际上是一个对Swing一无所知的框架的插件.我的插件将在调用时显示一个对话框,以便从用户那里获得一些输入并在之后退出,但框架将/必须继续运行.所以我不能打电话System.exit.

但如果我不这样做,EDT将继续运行,一旦框架完成,EDT仍将运行并运行并运行...

所以我想在不杀死应用程序的情况下杀死EDT.我怎么做?

java swing event-dispatch-thread

12
推荐指数
1
解决办法
1612
查看次数

在Java 7+中,在EDT之外使用Swing repaint()方法是否仍然安全?

我知道,repaint()即使使用Swing的线程模型,以前从任何线程调用和其他一些选定的方法都被认为是安全的,但是我最近在评论中告诉我并非如此.

谷歌发现很多旧的讨论说这是安全的,但最近没什么.所有过去曾经说过安全的官方参考文献似乎已经消失了,我在各种论坛上发现了一些人讨论它是如何不再安全的.

我找不到任何正式的东西来确认它是否存在 - 而且我真的希望看到一些解释改变逻辑的东西,如果它已被改变的话.考虑到破坏现有应用程序的风险有多严重,删除它似乎是一个非常奇怪的功能.

我真的在寻找一个官方参考链接(即Javadoc,oracle教程或源代码链接),说明这些方法是否可以安全地从任何线程调用.

这里提到这个问题:

在EDT之外安全使用Component.repaint()?

从现已消失的Sun页面中引用一句话:

以下JComponent方法可以安全地从任何线程调用:repaint(),revalidate()和invalidate().repaint()和revalidate()方法将事件派发线程的请求分别调用paint()和validate().

这符合我的理解,但我现在找不到那个页面或任何类似的页面,我看到几个人的未经证实的谣言说它不再安全.但另一方面,我找不到任何明确的说这个功能已经改变.

改变笔记

可能有助于解决这个问题的是Oracle关于Swing线程处理变化的官方声明.我发现了"Java 7中的更改"页面,但根本没有提到它,这些页面都没有以任何方式提及线程或EDT:

http://docs.oracle.com/javase/7/docs/technotes/guides/swing/enhancements-7.html

http://docs.oracle.com/javase/7/docs/technotes/guides/awt/enhancements-7.html

java swing multithreading repaint event-dispatch-thread

12
推荐指数
1
解决办法
1963
查看次数