繁体   English   中英

Java - 状态模式:在状态中使用线程

[英]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.:

  • 我对 Java 中的多线程没有太多经验(我假设将状态机的方法标记为同步可以确保线程安全)。
  • 由于每次调用状态机方法的线程和可运行创建而产生的开销。

所以我的问题是:什么是在等待 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM