gpt4 book ai didi

java - 我应该为这个 CPU 模拟应用程序使用 Java "worker thread"吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:14 25 4
gpt4 key购买 nike

我正在用 Java/Swing 编写旧计算机的模拟器,我想我已经确定了我遇到的设计问题。尽管这个应用程序很特别,但我怀疑有人会找到解决这个问题的“模式”。

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

机器有一个 GUI 线程(控制台)——带有按钮和开关,以及一个模型线程 (CPU),控制台与之通信以导致控制台事件改变 CPU 的状态。当然,控制台是由 AWT 事件队列中的事件驱动的。控制台通过在 CPU 接收的优先级阻塞队列中排队消息来与 CPU 通信。因此,CPU 也被构造为一个事件循环。到目前为止,还不错。

问题在于,当您在控制台上按下“开始”时,您希望 CPU 开始执行其内存中的任何程序。它仍然需要响应来自控制台的开关 throw 和按钮按下(例如停止),但它主要需要坐在那里并在其指令获取-解码-执行循环中旋转。

即使这暂时没有问题:我有一个名为 Cycle() 的方法,它会执行当前指令的一个特定“循环”,然后返回,立即重新分配给执行下一个循环。我将对 Cycle() 的调用置于 CPU 的运行循环中,并在每个循环后轮询消息队列。如果 CPU 停止,运行循环将简单地等待消息队列。

现在:我正在执行 I/O 指令,例如读卡。其中一个周期有必要向相关外围设备发送数据请求(它本身实现为在单独线程上运行的 GUI/模型),然后等待要到达的数据。这完全打破了 CPU 是一个简单的事件循环的整个概念,它接收消息并根据它们采取行动,而不会在过程中引起阻塞。这个新周期阻塞。如果运算符(operator)没有将卡片组装入读卡器,它可能会阻塞很长时间。

我考虑过将指令 fetch-decode-execute 循环分解为一个单独的“工作”线程,但我认为这不太合适,因为工作线程(据我所知)旨在异步运行 < strong>完成,并且在运行时不继续与其父线程交互。 (事实上​​ ,我想不出为什么“工作线程”应该永远终止。)此外,当一个循环需要访问可以同时修改为控制台按键的结果。

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

最佳答案

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 , 没有特定的时间限制,它可以在 event dispatch thread 上传达结果通过 publish() 方法在它的生命周期中不断地发布。我看到的唯一潜在问题是相应的 process() 方法可能会收到合并的结果。作为引用,这是一个 example .

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

最后,你可能会看看这个 answer其中提到了 Java 中的 6502 仿真。

关于java - 我应该为这个 CPU 模拟应用程序使用 Java "worker thread"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6824180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com