我在eclipse中有一个Java项目,它分为两部分;两个不同的主类,基本上运行两个不同的线程。 一个包含非常慢的加载,初始化和调试显示过程。而另一方则操纵初始化数据。为了检索第二部分中的信息,第一部分“保存”包含类实例的静态映射内的所有引用。
是否存在只运行第一部分一次的方法,然后再编译并运行第二部分?我试着设置两个不同的控制台并在不同的时间按下运行按钮,但第二个类的静态字段在第二个运行时看起来不存在。
我现在只在第二部分工作,所以我需要多次测试和启动它。我非常感谢帮助节省了大量时间浪费在始终初始化同样的事情。
ps:如果我将两个部分放在一起,一切正常。 提前致谢 卢卡
感谢重播(Multithreader,Stephen C)我试图让问题更加清晰,并询问如何解决它,因为我的解决方案看起来不是最好的......
编辑1:“第一部分”初始化程序,然后运行一个定期更新的简易GUI。因此,只要它出现,我们就不应该关心如何管理用户的输入和输出
编辑2:“第二部分”从前一部分读取信息,并将字符串发送回GUI以进行调试。
编辑3:我对项目的形状没有特定的约束,所以如果有更好的解决方案,我可以改变结构。以及运行它的方式。
第一个问题1:有可能在eclipse中只编译项目的一部分而它们一起运行吗?我的意思是,如果两个线程正在运行,我可以停止一个,重新编译它并再次运行它,它可以看到从第一个线程创建的实例永远不会停止吗?基本上我需要引用内存中加载的相同静态变量(如果存在)。
更进一步的问题2:或者更幸运的是,存在一种方法来存储和加载Java类的文件实例,从而避免从草图中写入映射机制从/到txt文件?
答案 0 :(得分:0)
你在这里要问的并不完全清楚,但我假设你在谈论在同一个JVM中运行“第一部分”和“第二部分”......
是的,有可能。但这并不简单。
基本上,您需要重构代码,以便用户可以从外部与某些“控制盒”进行交互。例如,这可能只是一个简单的命令循环,它从标准输入读取命令并运行它们。 (或者,您可以将应用程序转换为“服务”,通过网络套接字,RMI,HTTP等接受请求。)
然后你连接起来,以便有一个“命令”来运行应用程序的“第二部分”以响应用户的请求。
这是基础知识。您要做的另一件事是“编译并运行第二部分[很多次]”。这意味着您需要设置“控制盒”,以便在修改并重新编译后,可以为“第二部分”加载代码的新副本。要实现这一点,您需要创建一个新的ClassLoader对象(每次)并使用它来加载构成“第二部分”的类。这是可能的,但有点棘手。您需要解决的问题包括:
将“第一部分”和“第二部分”拆分为单独的JAR文件(或目录树)。 “第一部分”需要是自包含的......在“第二部分”中不依赖于类。
确保“第一部分”数据结构中没有运行时引用到“第二部分”中对象/枚举的实例。
如果您没有获得上述权利,您可能会遇到“permgen”存储泄漏和神秘的类型转换错误。
总而言之,要做到这一点,还有很多工作要做。除非您已经了解所涉及的所有技术,否则我怀疑它会为您节省整体时间。更好的想法可能是弄清楚如何加速“第一部分”的初始化;例如通过延迟初始化,或使用一些快速/轻量级持久性机制来缓存数据结构。
答案 1 :(得分:0)
我认为最好更改您的设计,除非要求它保持不变。
虽然我没有要求或您实际想要完成的任务,但我建议您使用以下设计: 1. App_1进行计算,然后将结果写入文件 2. App_2读取文件检查,如果不存在则显示错误信息;否则阅读文件并继续......
答案 2 :(得分:0)
我想我找到了一个棘手的解决方案。它很脏但它在eclipse调试器中原生工作。
我在调试模式下运行一个main方法,该方法创建一个充当调用者的线程。这将运行项目的第一部分并等待初始化完成(请注意,第一部分并未在此处结束,它仍然循环以显示基于静态类的调试信息,该静态类随程序的第二部分发展)。然后它以无限循环开始,它只调用我要测试和更改的第二部分:这里还有一个断点。 好吧,现在我可以在第二部分进行编码,而eclipse调试器在断点处等待,而不是保存并点击F8。调试器恢复,算法运行,然后在断点处再次停止。只需检查是否有效,最后更改某些内容然后保存并再次点击F8,无需等待重新初始化项目的第一部分。
可能这个方法必须在一段时间后重新启动,但仍然,最好每次重启:) 非常感谢你的帮助。 如果有人有更优雅的方式,欢迎他们!