我正在做一个多线程Java优化算法,它启动同一个子类的各种实例,这是出于时间改进的原因。这个子类本身有其他子类。
algorhthm通过搜索空间搜索最佳解决方案,通过随机移动。所以,如果我运行它的几个实例,我应该利用我的系统核心并改善搜索空间的搜索。
我注意到第一个实例运行良好,但其他人似乎共享第一个实例的运行对象,选择他们持有的信息,即使它已经完成。
这不是我想要的;我希望任何一个实例都能与其他实例保持隔离。
我正在使用Executor服务:
代码:
ExecutorService executorService = Executors.newCachedThreadPool();
ExecutorCompletionService<float[][]> service = new ExecutorCompletionService<float[][]>(executorService);
IteratedGreedy[] ig = new IteratedGreedy[instances];
Future<float[][]>[] future = new Future[instances];
// launching instances:
for (int i=0; i<instances; i++)
{
path = "\\" + i + ".txt";
ig[i] = new IteratedGreedy(path);
future[i] = service.submit(ig[i]);
}
// retrieveing solutions:
for (int i=1; i<instances; i++)
{
solutions[i] = future[i].get();
}
您可能认为,IteratedGreedy函数内部有自己的子库。
感谢任何帮助。
答案 0 :(得分:-1)
问题是,代码中的某个地方,是一个带有全局静态变量的类:
static float[][] matrix;
然后,一种方法使用它:
SomeMethod()
{
int f = matrix[i][b];
}
解决方案是改变方法获取对象的方式:
float[][] matrix;
SomeMethod(float[][] matrix)
{
int f = matrix[i][j];
}