我应该为此CPU仿真应用程序使用Java“工作线程”吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我应该为此CPU仿真应用程序使用Java“工作线程”吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2204字,纯文字阅读大概需要4分钟。
内容图文
![我应该为此CPU仿真应用程序使用Java“工作线程”吗?](/upload/InfoBanner/zyjiaocheng/673/c4aef345a00443428958533ba7343107.jpg)
我正在用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仿真.
内容总结
以上是互联网集市为您收集整理的我应该为此CPU仿真应用程序使用Java“工作线程”吗?全部内容,希望文章能够帮你解决我应该为此CPU仿真应用程序使用Java“工作线程”吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。