如果我在invokeLater中创建一个类的实例,该类中的所有方法都在EDT上运行吗?

时间:2017-11-10 10:06:30

标签: java multithreading user-interface event-dispatch-thread

public static void main(String[] args){
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            Mainwindow frame = new MainWindow();
            frame.setVisible(true);
            }

public class MainWindow extends JFrame {

public MainWindow(){
 // methods to set title, bounds, JPanels, etc.
 }

public static void methodOne(){
// updates GUI
}

public static void methodTwo(){
// also updates GUI
}

问题1:说我打电话

 MainWindow.methodOne 

来自static main,或来自静态main中实例化的另一个类。

是从EDT或初始线程运行的methodOne()?

Qustion 2:引用方法内部顶部的代码

@Override
public void run(){
}

最佳做法是使用:

MainWindow frame = new MainWindow();
frame.setVisibility(true);

或简单地说:

new MainWindow();

并且

setVisibility(true)
在MainWindow构造函数内部,考虑到MainWindow中的所有方法都是静态的吗?

请把所有答案都愚蠢,我对编码很新......

提前致谢

1 个答案:

答案 0 :(得分:0)

Querstion 1

方法中的代码将在调用它们的线程上运行,对于您在哪个线程上创建调用方法的对象并不重要。在特定线程上创建对象时,只保证其构造函数在该线程上运行。

此外,在这种情况下,由于您使用static方法,这些方法不属于frame实例,它们属于MainWindow类。

问题2

您使用的方法取决于您尝试做什么。 第一种方法为您提供了更多控制,使用它,您可以在某个时刻创建该类的新实例并在以后显示它。

第二种方法通常用于主框架,程序启动时显示的框架可以将该语句放在类中。构造