2

我在eclipse中有一个Java项目,分为两部分;两个不同的主类基本上运行两个不同的线程。一个包含加载、初始化和调试显示过程,这些过程非常缓慢。同时,另一个操作初始化的数据。为了在第二部分中检索信息,第一部分将所有引用“保存”在包含类实例的静态映射中。

是否存在只运行第一部分一次,然后再编译和运行第二部分的方法?我尝试只设置两个不同的控制台并在不同时间按下运行按钮,但是当第二个运行时,第一个类的静态字段看起来不存在。

我现在只在第二部分工作,所以我需要多次测试和启动它。我非常感谢帮助节省大量时间浪费在始终初始化相同的东西上。

ps:如果我同时运行这两个部分,一切都很好。提前感谢卢卡

感谢重播(Multithreader,Stephen C),我试图让问题更清楚,并询问如何解决它,因为我的解决方案看起来不是最好的......

编辑1:“第一部分”初始化程序,然后运行一个定期更新的简单GUI。所以只要它出现了,我们就不应该关心如何管理用户的输入和输出

编辑 2:“第二部分”从前面读取信息并将字符串发送回 GUI 以进行调试。

编辑 3:我对项目的形状没有特定的限制,所以如果有更好的解决方案,我可以改变结构。以及运行它的方式。

更远的问题1:有可能在eclipse中只编译项目的一部分,而它一起运行?我的意思是,如果有两个线程正在运行,我可以停止一个,重新编译它并以一种可以看到从第一个线程创建的实例永不停止的方式再次运行它吗?基本上我需要引用内存中加载的同一个静态变量,如果它存在的话。

更进一步的问题 2:或者更幸运的是,确实存在一种方法来存储和加载 Java 类的文件实例,避免从草图中写入从/到 txt 文件的映射机制?

4

3 回答 3

0

尚不完全清楚您在这里问什么,但我假设您正在谈论在同一个 JVM 中运行“第一部分”和“第二部分”......

是的,有可能。但这并不简单。

基本上,您需要重构代码,以便用户可以从外部与之交互的某种“控制盒”。例如,这可能只是一个简单的命令循环,它从标准输入中读取命令并运行它们。(或者,您可以将您的应用程序变成一个“服务”,通过网络套接字、RMI、HTTP 等接受请求。)

然后你连接起来,以便有一个“命令”来运行应用程序的“第二部分”以响应用户的请求。

这就是基础。您要做的另一件事是编译并运行第二部分 [许多] 次”。这意味着您需要设置“控制框”,以便在您修改和重新编译后,它可以为“第二部分”加载代码的新副本。为此,您需要(每次)创建一个新的 ClassLoader 对象并使用它来加载构成“第二部分”的类。这是可能的,但有点棘手。您需要解决的问题包括:

  • 将“第一部分”和“第二部分”拆分为单独的 JAR 文件(或目录树)。“第一部分”需要是独立的......“第二部分”中的类不依赖。

  • 确保没有从“第一部分”数据结构到“第二部分”中的对象/枚举实例的 运行时引用。

如果您没有正确理解上述内容,您很可能会遇到“permgen”存储泄漏和神秘的类型转换错误。


总而言之,要完成这项工作需要做很多工作。除非您已经了解所涉及的所有技术,否则我怀疑它是否会总体上节省您的时间。一个更好的想法可能是弄清楚如何加快“第一部分”的初始化;例如,通过延迟初始化,或使用一些快速/轻量级的持久性机制缓存数据结构。

于 2013-07-28T01:07:49.427 回答
0

我认为最好改变你的设计,除非它需要保持不变。

虽然我没有要求或您实际想要完成的任务,但我建议您采用以下设计: 1. App_1 进行计算,然后将结果写入文件 2. App_2 读取文件检查,如果不存在则显示错误信息; 否则请阅读文件并继续...

于 2013-07-28T07:36:15.473 回答
0

我想我找到了一个棘手的解决方案。它很脏,但它在 eclipse 调试器中本机工作。

我在调试模式下运行一个主方法,它创建一个作为调用者工作的线程。这将运行项目的第一部分并等待初始化完成(请注意,第一部分并没有在这里结束,它仍然循环显示基于静态类的调试信息,该静态类随着程序的第二部分演变)。然后它从一个无限循环开始,它只调用我想要测试和更改的第二部分:这里还有一个断点。好吧,现在我可以在 Eclipse 调试器在断点处等待时在第二部分进行编码,而不是保存它并按 F8。调试器恢复,算法运行,然后在断点处再次停止。只需检查是否有效,最终更改某些内容然后保存并再次按 F8,无需等待重新初始化项目的第一部分。

可能这个方法必须在一段时间后重新启动,但还是每次都重新启动:)非常感谢您的帮助。如果有人有更优雅的方式来做到这一点,他们是受欢迎的!

于 2013-07-28T17:44:26.813 回答