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