编程语言
首页 > 编程语言> > 我应该为此CPU仿真应用程序使用Java“工作线程”吗?

我应该为此CPU仿真应用程序使用Java“工作线程”吗?

作者:互联网

我正在用Java / Swing写一台旧计算机的仿真器,我认为我已经确定了我遇到的设计问题.尽管此应用程序具有特殊性,但我怀疑有人会找到此问题的“模式”.

我应该补充一点,我仍然是OOP,GUI和设计模式的初学者.

该计算机具有一个GUI线程(控制台)(带有按钮和开关)和一个Model线程(CPU),控制台与控制台线程进行通信以导致控制台事件更改CPU的状态.当然,控制台是由AWT事件队列中的事件驱动的.控制台通过在CPU接收的优先级阻塞队列上排队消息来与CPU通信.这样,CPU也被构造为事件循环.到现在为止还挺好.

问题是,当您在控制台上按START键时,您希望CPU开始执行其内存中的任何程序.它仍然需要响应控制台中的开关抛出和按钮按下(例如STOP),但是它主要需要坐在那里并旋转其指令fetch-decode-execute循环.

甚至在一段时间内也没有问题:我有一个称为Cycle()的方法,该方法将执行当前指令的一个特定“周期”,然后返回,然后立即重新分配以执行下一个周期.我将对Cycle()的调用放置在CPU的运行循环中,并在每个循环之后轮询消息队列.如果CPU已停止,则运行循环将仅在消息队列上等待.

现在:我正在执行I / O指令,例如读卡.必须有一个周期将数据请求发送到有问题的外围设备(本身作为在单独线程上运行的GUI /模型来实现),然后等待数据到达.这完全打破了CPU的整体概念,它是一个简单的事件循环,可以接收消息并对其执行操作,而不会引起进程阻塞.这个新的周期将被阻止.而且,如果运算符还没有在读卡器中装入卡座,则可能会阻塞很长时间.

我曾考虑将指令fetch-decode-execute循环分解到一个单独的“工作者”线程中,但我认为这不合适,因为工作线程(据我所知)旨在异步运行以完成任务,并且运行时不要继续与其父线程进行交互. (实际上,我想不出为什么“工作线程”应该永远终止.)而且,当一个周期需要访问可以通过控制台按键同时进行修改的数据时,当前不需要同步.

那么,我如何设法将“事件驱动”处理与传统的批处理合并,该批处理需要在继续之前显式等待消息?

解决方法:

Worker threads (as I understand them) are intended to run asynchronously to completion, and do not continue to interact with their parent thread while running.

通用实现SwingWorker没有特别的时间限制,它可以在其生存期内通过publish()方法在event dispatch thread上连续传递结果.我看到的唯一潜在问题是相应的process()方法可能会收到合并的结果.供参考,这里是example.

或者,让您的CPU模型使用计时器来驱动fetch-decode-execute循环. javax.swing.Timer很方便,因为它的动作事件处理程序在event dispatch thread上执行.您将必须使用此article中描述的技术来同步对任何共享数据的访问.

最后,您可能会看到此answer提到了Java中的6502仿真.

标签:swingworker,swing,event-driven,java
来源: https://codeday.me/bug/20191102/1990964.html