我最近了解到,Sun/Oracle最新的指导方针规定,任何Swing对象的Swing方法(包括构造函数)都不能在EDT之外调用。
http://www.velocityreviews.com/forums/t707173-why-does-jdk-1-6-rovidens-creating-swing-components-on-the-edt.html
引用:“除了实际的线程安全和相关的问题,如可见性和同步,我认为还有一个软件问题。Swing组件通常有某种类型的”监听器“,这些监听器被设计为在EDT上执行。
由于这些监听器是异步的,并且响应事件(如属性更改),因此可以在构建GUI时激发这些监听器。结果是,当您在主线程中构造时,一些侦听器正在EDT上执行,而一些侦听器可能也在其他线程上运行(因为侦听器被混淆并在错误的线程上激发)。结果是一个巨大的不可预测的混乱。“
在多线程Java程序中,正确的同步取决于发生-发生之前的关系,总结在内存一致性属性中。AWT组件是线程安全的,在java.AWT.component
中的私有锁对象上进行同步。关于一些历史观点,请参见评论:
private transient Object objectLock = new Object();
虽然这对于简单的程序来说已经足够了,但是更复杂的程序需要依赖于对此实现细节的了解来验证正确的同步。这是可能的,但是谁愿意满足于一个脆弱的AWT GUI呢?
另外几点:
>
@Hovercraft引用的这篇文章可以追溯到1998年,但它已经多次更新,以解决您引用的usenet线程中提到的新内存模型等问题。
正如这里提到的,javax.swing
的发展已经远离了GUI API的promise,而是朝着更加灵活的并发编程工具发展。
问题内容: 我认为以下伪代码很好地总结了我的问题… 由(拥有)拥有(拥有适当的字词?)。那么对象类型将如何调用? 起初我在想,但这是针对继承的类的。然后我想通过一个接口,我走对了吗? 问题答案: 如果dostuff是常规方法,则需要将Bar传递给实例。 请注意,Bar可能有很多所有者,但没有任何现实的方法来确定他们是谁。 编辑:您可能正在寻找内部类:示例和注释。
本文向大家介绍我们是否必须在实现Java接口的类中实现所有方法?,包括了我们是否必须在实现Java接口的类中实现所有方法?的使用技巧和注意事项,需要的朋友参考一下 是的,必须在实现接口的类中实现所有方法,直到并且除非该类被声明为抽象类。 只有两个选择- 实现接口定义的每个方法。 将该类声明为抽象类,结果迫使您在创建任何对象之前先对该类进行子类化(并实现缺少的方法)。 类不需要在接口中实现所有方法的
问题内容: 最近,我做了一个Netbeans项目,并且正在使用SVN。我看到重复的类错误,并且在控制台中显示 这是PieChartExplorer.java: 我努力了: 清理并重建项目 确保我在所有构造函数中都调用了super 如何解决?下载代码。 问题答案: 前几天我看到了这些症状。 我有我一直在编辑的文件,因此决定将更改分为2个提交。我进入了包含我的文件“ x / y / Z.java”的目
这是我的kotlin代码: 但这是崩溃。 引起:java.lang.Throwable:在线程JavaBridge上调用了WebView方法。所有WebView方法必须在同一个线程上调用。 我怎样才能解决这个问题?我通过搜索找到了解决方案,但这是java代码。Kotlin和Java兼容,但由于语法错误而未运行。(我想这是因为我不知道Kotlin和Java。无论如何) 我是一个基于JavaScrip
本文向大家介绍抽象类必须要有抽象方法吗?相关面试题,主要包含被问及抽象类必须要有抽象方法吗?时的应答技巧和注意事项,需要的朋友参考一下 不需要,抽象类不一定非要有抽象方法;但是包含一个抽象方法的类一定是抽象类。 示例代码: 上面代码,抽象类并没有抽象方法但完全可以正常运行。
问题内容: 是否有一种标准方法可以在Swift中制作“纯虚函数”,即。一个 必须 由每个子类中被覆盖,并且,如果不是的话,将导致编译时错误? 问题答案: 您有两种选择: 将超类定义为协议而不是类 Pro :编译时检查每个“子类”(不是实际的子类)是否实现了所需的方法 缺点 :“超类”(协议)无法实现方法或属性 2.声明该方法的超级版本 例: Pro :可以在超类中实现方法和属性 缺点 :不检查编译