[英]Java - State pattern: Using threads within the states
我想使用状态模式来协调来自 Java Swing GUI 的串行请求。 当调用状态方法时,串行通信将启动,并且在此期间不应冻结 GUI。
我有一个 GUI 线程。 在这个线程中,我正在调用状态机的方法,它也存在于 GUI 线程中。 在某些情况下,调用状态机方法后,应从串行端口获取数据(更长的任务)。 此获取是在otherThread
中完成的。 在某些状态更改时, otherThread
可以被中断,而otherThread
应该立即停止(我正在使用otherThread.interrupt()
)。 要知道otherThread
真正返回,我使用otherThread.join()
来等待 GUI 线程中的otherThread
。
在不使用join()
的情况下,我总是在状态更改后遇到异常,我通过另一个otherThread
中的串行端口进行通信。
这种方法的不便之处在于。 只要otherThread
需要完成其任务,GUI 线程就会被阻塞/冻结。
我正在考虑在第三个线程中调用状态机方法。 但我不喜欢这个想法 bcs.:
所以我的问题是:什么是在等待 otherThread 时使 GUI 不冻结的好方法?
所有关于“状态”、“状态机”和“状态模式”的东西都是红鲱鱼。 (意思是:完全不相关。)问题很简单,就是如何避免 gui 线程中的Thread.join()
块等待。
您的“otherThread”应该知道它被中断并优雅退出的事实。 (查找有关 Java 中线程中断的更多信息,以了解如何正确完成此操作。)
就在退出之前,“otherThread”应该向您的“gui thread”发回一条消息,让它知道它正在退出。
使用SwingUtilities.invokeLater()
将消息发布回 Swing 中的“gui 线程”,并且“消息”不完全是消息,它是您传递给invokeLater()
的函数,它在“ gui线程”。
然后,“gui 线程”然后可以忽略该线程,或者加入它,因为知道这个Thread.join()
将很快完成,因为线程终止是迫在眉睫,或者已经发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.