我有两个Java程序。 “第一”/“主”实现搜索算法,“其他”/“第二”使用Repast仿真框架来运行多代理仿真。在“第一个”Java程序中,我有以下代码块:
Class Individual{
public int getvalue()
{
While (Condition is true)
{
Start_MAS(); //start the simulation by calling the "second" Repast simulation program
//which will write some values to a text file at the end of the simulation
//read text file and do some work with the values
}
}}
MA模拟/“第二”程序将运行模拟直到满足特定条件或经过900个时间步长,并且一旦满足停止条件,程序将把一些输出写入文本文件,这是通过“第一”程序阅读。 现在我的问题是,当我运行“第一个”程序(在某些时候调用/运行第二个程序/模拟)时,它不会等待模拟/“第二个”程序完成,但会发生什么事情是在一段时间之后运行模拟/“第二”程序时,“第一”程序将继续运行自己的代码,该代码正在读取输出文本文件,因此我得到文本文件为空的错误。
我的问题是如何强制“第一”程序等待或停止运行其代码,直到“第二”/模拟程序完成(已满足停止条件并且输出已写入文本文件)?我想在“第一”程序中使用wait并在“第二”程序中通知如下:
在“第一”计划中:
Class Individual{
public int getvalue()
{
While (Condition is true)
{
Start_MAS(); //start the simulation by calling the "second" program which will write some
//values to a text file at the end of the simulation
synchronized(this)
{
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//read text file and do some work with the values
}
}
在“第二”计划中:
public void step(){ //a function called in each time step in the simulation
If (Stop condition is met)
MyPackage.Individual.notify();
}
但如果我这样做,它将在从“第二”程序返回后执行等待,并且如果我在调用之前放置它将等待然后开始模拟。是否正在使用等待并通知正确的方法来执行此操作?有关如何完成此任务的任何建议或提示?
非常感谢你!
答案 0 :(得分:0)
我怀疑您的Repast模拟是否真正提前终止,因为从您的第一个应用程序以编程方式运行它与单独测试第二个程序(Repast模拟)之间的条件存在差异。
因此 - 我建议您在停止条件块中放置一些调试语句,以检查模拟在返回之前是否真正停止。如果是这样,你有一个不同的问题要问模拟停止的原因,而不是关于进程/线程的问题。 e.g。
...
If (Stop condition is met)
{
System.out.println("Stop condition has been met at tick " +
RepastEssentials.getTickCount());
}
...
我还建议你加入repast-interest列表来获得这些问题的答案(我不是Repast项目的成员,但要定期使用它)。这些问题经常被提出并解决,列表是活跃的。
N.B。关于这个确切问题的最新帖子已经解决here(张贴供参考 - 虽然看那里的数字,也许这个问题来自你?)。