一般在SWING / Java中使用线程时的最佳实践

时间:2011-07-12 01:58:43

标签: java swing thread-safety

我有一个SWING UI,其中包含一个创建新SwingWorker线程的按钮。然后该线程在SQLite数据库中查询结果以将它们放入JTable中。在我的StringWorker构造函数中,参数是从其他SWING组件(如JSpinner,JComboBoxes等)获取的各种字段。

由于我是所有这些线程的新手,我想从更多知识渊博的程序员那里得到一些关于如何去做我想做的事情的建议。

  1. 我想知道当我用System.exit(0)关闭程序时线程是否会自动结束;所以我最终没有内存泄漏

  2. 确保我没有两个线程同时访问我的数据库的最佳方法是什么(让我们说用户点击按钮多次,或者其他情况下,管理员正在更新数据库将一些文件作为输入(在我的程序中),然后当第一个线程解析文件并更新数据库时,他想使用按钮等查询数据库)。

  3. 使用线程是否较慢?起初我在EDT中完成了所有计算,当然按下按钮后每次锁定UI,但如果我没记错的话,它只会锁定大约5秒钟。现在,当我按下按钮时,它没有锁定,但似乎结果需要花费不到两倍的时间才能显示在JTable中。是因为我在我的代码中犯了错误还是这是正常的?

  4. 我虽然在查询所在的类中使用静态字段,但如果它正在使用中则将其设置为true。这是正确的做法吗?这样,无论哪个线程正在使用数据库,第二个线程都不会启动。

2 个答案:

答案 0 :(得分:3)

  

我想知道当我使用System.exit(0)关闭程序时线程是否自动结束;

是。整个过程将结束,并且线程也是此过程的一部分。但是,如果不调用System.exit(),则所有非守护程序线程必须在进程消失之前完成。

  

确保我没有两个线程同时访问我的数据库的最佳方法是什么

由于它是Swing应用程序,我假设您和管理员无法同时访问该应用程序。但是,为了保证即使在单个应用程序中您也无法启动影响数据库的多个操作,您必须阻止UI。禁用按钮或将玻璃窗格置于UI顶部。模态进度对话框也很有帮助。

  

使用线程是否较慢?

不,如果做得对,它并不慢。操作缓慢需要花费的时间。您无法使用线程修复它,但您可以保持速度(感知)相同,同时提供良好的非阻塞UI,或者您可以一次执行多个慢速操作,从而提高感知速度。

答案 1 :(得分:3)

  1. 如果不是绝对必要(不应该),请不要在代码中使用System#exit。以下是一些explanations为什么以及哪些更好。

  2. 您的数据库能够处理两个并发请求,因此它本身并不是一件坏事。如果您通过DataSource使用JDBC及其池化连接,那么您应该一次将一个这样的连接的使用限制为一个线程。为了解决冗余数据库查询的问题,例如当“点击两次”时,可能有多个解决方案。我在这里假设你的意思是你有一个分发给几个人的Swing UI,并且每个实例都与同一个数据库进行通信 - >只要执行数据库查询,只需禁用您的按钮即可。

  3. 如果由于工作人员的执行安排而没有直接在事件调度线程中运行代码,则速度稍慢,但这不应该是明显的。要查看出现了什么问题,我必须查看相关代码。