当前位置: 首页 > 面试题库 >

防止GUI冻结并具有取消操作/杀死线程的按钮

严书
2023-03-14
问题内容

这是我想做的事情:

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

答案是否与使用EDT有关?如果是这样,应如何实施?

PS为澄清起见,该按钮应该能够杀死创建连接的线程。看完后似乎是executorService。可以帮上忙吗?是?还是根本不?


问题答案:

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

  • 在UI的任何修改或从中读取(例如,以获得一个文本框的值) 必须 在UI线程(有时也被称为“Swing线程”或“事件指派线程”上(EDT)
  • 任何阻塞或长时间运行的操作(例如网络通信)都 不得 在UI线程上运行。否则,它们将阻止按钮正常工作,文本无法更新等。
  • 在Java中,ExecutorService和其朋友将使在后台线程上运行长时间或阻塞的东西相对容易
  • 如果在后台线程上发生需要您更新UI的事件,请在EventQueue.invokeLater调用中封装与UI相关的代码。这将确保Runnable您传递的内容在UI线程上执行。

SwingWorker类封装这种逻辑,并提供一个易于使用的帮手简单的情况。

第一次执行此操作时,可能会有些令人生畏,但彻底了解这一点很有意义,因为它不仅适用于Swing,而且适用于任何其他UI代码。



 类似资料:
  • 问题内容: 我有一个程序在其中加载文件,同时显示一个窗口以通知用户正在加载文件。我决定制作一个FileLoader类,它是一个实际上处理了文件加载的SwingWorker类,以及一个实现PropertyChangeListener的ProgressWindow,用于通知用户传递给它的SwingWorker的状态。 我的代码当前如下所示: 问题是,每当我调用loader.get()时,它都会冻结GU

  • 注意:我工作了很多时间并研究了google和stackoverflow,但我找不到答案。 我用线。sleep(),它冻结了所有其他JDialog、JFrame和线程。 我的示例代码: 在这种情况下,JDialog无法正确显示: inccorect出现jdialog 但它必须符合这一点: true出现jdialog 我怎样才能解决这个问题。我想让主线程等待另一个线程。有人可以纠正我的示例代码,或者在

  • 我是Swing的新手,所以这似乎是一个非常天真的问题。 我有一个JFrame,它显示一个初始语句和两个单选按钮。RadioButton1表示接受,RadioButton2表示拒绝。如果用户选择接受,程序将继续。因此,我为Accept创建了一个ActionListener,以便我的其余代码都在这个ActionListener中。然而,只要用户按下Accept,GUI就会冻结。按Reject键只是程序

  • 我有一个用PHP编写的守护进程(不是最好的语言,但与我一起工作),它用于从队列接收作业,并在需要完成作业时处理它们。对于每个新作业,我使用pcntl_fork()将作业分叉到子进程中。在这个子进程中,我然后使用proc_open()执行用于音频转码的长时间运行的系统命令,完成后直接返回到子进程。作业完成后,子进程退出并由父进程清理。 为了保持这个守护进程始终运行,我使用upstart。这是我的暴发

  • 按下按钮后,我的界面冻结。我使用线程,但我不知道为什么仍然挂起。任何帮助都将不胜感激。提前谢谢

  • 从Android API 26开始,Android系统要求“执行一些用户可以注意到的操作”的服务将自身注册为前台服务。和“前台服务必须显示通知” 我有一个播放音频文件的服务。当播放暂停时,用户应该能够滑动通知(与Google Play音乐应用程序一样)。但是如果我调用,那么我的服务会在几分钟内被系统杀死。 暂停播放时,如何允许删除通知?