我完成了一个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());
}
(...我希望我能很好地理解并发性)
提前谢谢。
答案 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()"
除此之外,如果您计划阻止应用程序,那么为什么还需要启动另一个线程呢?