java - 防止 GUI 卡住并具有取消操作/终止线程的按钮

标签 java multithreading swing

这是我正在尝试做的事情:

我有一个 JFrame,其中包含一个 JTextArea,显示正在进行的连接的更新。如果用户想要取消连接,他们应该能够按其右侧的 JButton 。但是,由于连接在尝试连接时阻塞(使用)线程,因此 GUI 被卡住。我正在寻找快速修复方法。可能将 ActionListener 放在单独的线程上吗?尽管我可以基本使用可运行对象,但我对线程没有太多经验。

答案与使用 EDT 有关吗?如果是这样应该如何实现?

PS 澄清一下,该按钮应该能够终止创建连接的线程。看完之后好像是一个executorService。可以帮忙吗?是的?或者根本没有?

最佳答案

建议首先快速了解 Swing(或几乎任何 UI 框架)和多线程。这是餐巾纸版本:

  • 对 UI 的任何修改或从中读取(例如,获取文本字段的值)必须在 UI 线程(有时也称为“Swing 线程”或“事件调度线程”(EDT)
  • 任何阻塞或长时间运行的操作(例如网络通信)不得在 UI 线程上运行。否则它们将阻止按钮工作、文本更新等。
  • 在 Java 中,ExecutorService 及其 friend 将使长时间运行或阻塞的内容在后台线程上运行变得相对容易
  • 如果后台线程发生需要更新 UI 的情况,请将 UI 相关代码封装在 EventQueue.invokeLater 调用中。这将确保您传递的 Runnable 在 UI 线程上执行。

SwingWorker 类封装了此逻辑,并为更简单的情况提供了一个易于使用的帮助器。

第一次这样做时,可能有点令人畏惧,但彻底理解这一点是值得的,因为它不仅适用于 Swing,也适用于任何其他 UI 代码。

关于java - 防止 GUI 卡住并具有取消操作/终止线程的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16276902/

相关文章:

java - 我是否错误地使用了 notify java

java - 带 Swing 的测试套件

java - 在 JInnerFrame 中使用 AWT 组件(对于 JDesktopPane)

java - 如何在JFrame上绘制文本并在java中清除?

java - 您能确定集合的内存占用量吗?

java - org.hibernate.HibernateException : Unable to instantiate default tuplizer

java - 当静态 block 期间失败时,在 Java 中手动加载类

java - 为什么并发线程限制没有按预期工作?

java - 并发求和列表,由另一个线程填充

java - Java中的线程继承