我已经为使用swing的桌面开发了一个高级java应用程序(Financial Management
),我有一些客户正在使用它。最近我的一位客户表示,有时候应用程序冻结了,当他做了很多工作时他不得不重新启动它。
问题是当我测试我的机器上的应用程序工作正常时,即使我用一些动作和数据超载它也不要冻结!
任何人都可以给我一些提示,说明可以使swing java应用程序执行此类操作的可能性是什么,以及如何提高应用程序的性能。
答案 0 :(得分:3)
它可能有很多原因。我的第一个猜测是代码中的race condition。一个有趣的事实是,如果应用程序使用0%CPU时间或100%CPU时间,它看起来是冻结的。 0%表示有些东西在等待(死锁)。 100%表示无限循环。 如果您可以访问客户端的计算机,则可以将调试器连接到冻结的应用程序,或使用jstack创建堆栈跟踪转储。
答案 1 :(得分:0)
一种可能性是在Swing线程中运行大型任务而不是另一个线程,例如在actionListener中执行大型任务:
foo.addActionListener((ActionEvent ae) -> {
// time consuming task
});
这将导致所有用户界面部件冻结,直到函数返回。确保诸如此类的函数将实际工作传递给新线程或设置标志以在现有线程中执行工作。
例如在Main中有一个静态布尔值,在主循环中检查:
public static class Main {
public static boolean do_action;
public static void main(){
while( true ) {
if( do_action ) {
// do action of some kind
do_action = false;
}
// sleep or do other things
}
}
}
这样的动作听众:
foo.addActionListener((ActionEvent ae) -> {
Main.do_action = true;
});