以下是我要做的事情:
我有一个JFrame
,其中包含JTextArea
显示正在进行的连接的更新。如果用户想要取消连接,则应该能够按下其右侧的JButton
。但是,由于连接在尝试连接时阻塞(使用)线程,因此GUI将被冻结。我正在寻找快速解决方案。可能在单独的线程上有ActionListener
吗?虽然我可以基本使用runnables,但我对线程没有多少经验。
答案是否与使用EDT有关?如果是这样,应如何实施?
PS澄清一下,按钮应该可以杀死创建连接的线程。看完后似乎是一个executorService。可以帮忙吗?是?或者根本没有?答案 0 :(得分:5)
建议首先加快Swing(或几乎任何UI框架)和多线程的速度。这是餐巾纸版本:
ExecutorService
及其朋友会让在后台线程上运行长时间运行或阻塞内容相对容易EventQueue.invokeLater
调用中封装与UI相关的代码。这将确保您传递的Runnable
在UI线程上执行。 SwingWorker
类封装了这个逻辑,并为更简单的案例提供了一个易于使用的帮助器。
第一次这样做时,它可能有点令人生畏,但要彻底理解这一点是值得的,因为它不仅适用于Swing,也适用于任何其他UI代码。
答案 1 :(得分:1)
为了澄清,按钮应该能够杀死创建连接的线程。看完后似乎是一个executorService。可以帮忙吗?是?或者根本没有?
是
while(localBooleanVariable)
在Runnable#Thread
内,普通线程
最简单的可能是SwingWorker
,因为可以取消,publish()
,progress()
的输出是在美国东部时间