Несколько экземпляров Java одного и того же класса совместно используют одни и те же запущенные объекты, но они не должны
Я делаю многопоточный алгоритм оптимизации Java, который инициирует различные экземпляры одного и того же подкласса по причине улучшения времени. У этого подкласса есть и другие подклассы.
Алгоритм ищет через пространство поиска оптимальное решение с помощью случайных движений. Поэтому, если я запускаю несколько его экземпляров, я должен воспользоваться преимуществами ядра моей системы и улучшить поиск, расширяя область поиска.
Я заметил, что первый экземпляр работает хорошо, но другие, кажется, разделяют запущенные объекты первого, выбирая информацию, которую они держат, даже когда она закончена.
Это не то, что я хочу; я хочу, чтобы любой из экземпляров был изолирован для других.
Я использую Executor Services:
Код:
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 ответ
Проблема в том, что где-то в коде есть класс с глобальной статической переменной:
static float[][] matrix;
И тогда метод использует это:
SomeMethod()
{
int f = matrix[i][b];
}
Решение состоит в том, чтобы изменить способ, которым метод получает объект:
float[][] matrix;
SomeMethod(float[][] matrix)
{
int f = matrix[i][j];
}