Java同一个类的多个实例共享相同的运行对象,但它们不应该共享

时间:2014-05-09 09:59:54

标签: java multithreading executorservice

我正在做一个多线程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函数内部有自己的子库。

感谢任何帮助。

1 个答案:

答案 0 :(得分:-1)

问题是,代码中的某个地方,是一个带有全局静态变量的类:

static float[][] matrix;

然后,一种方法使用它:

SomeMethod()
    {
    int f = matrix[i][b];
    }

解决方案是改变方法获取对象的方式:

float[][] matrix;

SomeMethod(float[][] matrix)
    {
    int f = matrix[i][j];
    }