我应该用run(){}包围什么代码?

时间:2011-05-17 10:58:11

标签: java multithreading swing

我完成了一个2000行的Swing + SQL程序,我想在所有内容初始化之前添加一个登录窗口。登录窗口是JFrame类,来自主程序。

所以我的主应用程序需要实现Runnable。我想用我正在创建的线程所需要的只是等待wait() - 直到登录线程结束 - 并使用notify() - 。

我的程序包含许多可视组件,方法,main(),构造函数,初始化程序等。run(){}应包含的最小代码量是多少?

这是我想要做的一个例子。这绝不是正确的(我想),但你会得到它:

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());

}

(...我希望我能很好地理解并发性)

提前谢谢。

3 个答案:

答案 0 :(得分:2)

这里你不需要另一个线程。

在登录操作结束时,如果登录成功,请创建主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
   }
 }
}

答案 1 :(得分:2)

不确定我是否得到了你想要达到的目标但是......如果你想在后台运行initialize,那么你需要:

 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);

//if you want to start the thread yourself.
Thread t = new Thread(doInit);
t.start()

......真的不能比这更进一步,因为剩下的真的取决于你的逻辑。

只是为了完成,除非你的initialize方法需要花费大量时间来冻结应用程序的其余部分,否则不值得在此处使用线程。 initialize似乎没有做任何事情,只是设置了一些SWING属性。

答案 2 :(得分:1)

start a thread使用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()"

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