Java run(){}应该包含哪些代码?

Java run(){}应该包含哪些代码?,java,multithreading,swing,Java,Multithreading,Swing,我完成了一个2000行的Swing+SQL程序,我想在初始化之前为它添加一个登录窗口。登录窗口是一个JFrame类,从主程序实例化 所以我的主应用程序需要实现Runnable。我所要创建的线程只需等待——等待——直到登录线程完成——并使用notify 我的程序由几十个可视组件、方法、main、构造函数、初始值设定项等组成。运行{}时应该包含的最少代码量是多少 这是我想做的一个例子。我想这绝对不对,但你会明白的: private void initialize() { // Called from

我完成了一个2000行的Swing+SQL程序,我想在初始化之前为它添加一个登录窗口。登录窗口是一个JFrame类,从主程序实例化

所以我的主应用程序需要实现Runnable。我所要创建的线程只需等待——等待——直到登录线程完成——并使用notify

我的程序由几十个可视组件、方法、main、构造函数、初始值设定项等组成。运行{}时应该包含的最少代码量是多少

这是我想做的一个例子。我想这绝对不对,但你会明白的:

private void initialize() { // Called from main()

    this.setBounds(100, 200, 1024, 576);
    this.setTitle("Main app");
    this.setVisible(false);

    Runnable runnable = new Visual_Login();
    Thread login_thread = new Thread(runnable);

    login_thread.run();     
    main_thread.wait();

    this.setVisible(true);
    this.setContentPane(getJContentPane());

}
…我希望我能很好地理解并发


提前谢谢。

这里不需要其他线程

在登录操作结束时,如果登录成功,请创建主jframe类的实例并处理登录jframe

class MainFrame extend  JFrame{
 ...
}

class LoginFrame extends JFrame{
.
.
.
 public void login(){
   boolean loginSuccess = checkCredentials(username,password);
   if(loginSuccess){
      MainFrame main = new MainFrame();
      .
      .
      this.dispose();

   }else{
    //show some error to user
   }
 }
}
您可以使用start方法,而不是run方法。Thread类在正确配置自身后将调用run方法

在您的情况下,它应该是:

Runnable runnable = new Visual_Login();
Thread login_thread = new Thread(runnable);
login_thread.start();
// run() will be called later.

wait();
// waits for another thread to do notify or notifyAll.
// it should be around here where the runnable thread will "run()"

除此之外,如果您打算阻止应用程序,那么为什么需要启动另一个线程?

不确定我是否得到了您想要的结果,但是。。。如果要在后台运行初始化,则需要:

 Runnable doInit = new Runnable() {
     public void run() {
        component.initialize()
     }
 };
要运行它,您可以选择执行以下操作:

// if you are running a swing UI and you want the dispatcher to handle the thread.
SwingUtilities.invokeLater(doInit);

。。。不能再进一步了,因为剩下的都取决于你的逻辑


最后,在这里使用线程是不值得的,除非你的initialize方法做了一些需要花费大量时间冻结应用程序其余部分的事情。initialize似乎除了设置一些SWING属性之外什么都不做。

您的问题中有些奇怪。这个设计听起来不正确。登录对话框应该是模态JDialog,而不是JFrame。请注意,您不能创建新线程并调用swing方法。Swing是单线程的,Swing方法应该从AWT线程调用。好的,谢谢你的回答。只是好奇,AWT线是什么?可以有两个AWT线程吗?不,只有一个AWT事件线程,通常称为事件调度线程EDT;另见。非常聪明,我的想法正好相反。谢谢。您可以通过单击旁边的勾号来选择最适合您的案例的答案。虽然您的想法是我正在实施的,但所有答案对我都很有用,所以我不会选择一个。你好,恐怕我说得不够清楚。Initialize实际上通过它的最后一句话做了很多工作,所以它不能作为后台任务运行。。。。因为我节目的特殊性。谢谢你的开始修正。
//if you want to start the thread yourself.
Thread t = new Thread(doInit);
t.start()