Передача глобального параметра ввода / вывода в поток Java
У меня есть Java-программа, которая создает потоки, каждый из которых выполняет один и тот же код (один и тот же run()).
Моя главная выглядит так:
{
// Create threads
GameOfLifeThread[][] threads = new GameOfLifeThread[vSplit][hSplit];
for(int i=0; i<vSplit; i++){
for(int j=0; j<hSplit; j++){
threads[i][j] = new GameOfLifeThread(initalField, ...);
}
}
// Run threads
for(int i=0; i<vSplit; i++){
for(int j=0; j<hSplit; j++){
// threads[i][j].run();
(new Thread(threads[i][j])).start();
}
}
return ...;
}
initialField - это глобальный 2D-массив. Каждый поток должен внести в него некоторые изменения. Проблема в том, что после выполнения потоков массив остается неизменным, даже если существует только один рабочий поток. Тем не менее, когда я бегу
threads[i][j].run();
вместо
(new Thread(threads[i][j])).start();
с одним рабочим потоком (т. е. чисто последовательным выполнением основным потоком) initalField изменяется, как и должно.
В чем может быть проблема? Похоже, что элементы массива передаются по значению, но это не может быть так.
Заранее спасибо.
1 ответ
Всего лишь одна догадка:
Ваш initalField должен быть изменчивым, иначе он может быть кэширован потоками и не будет изменен (как просматривается другими потоками), потому что они могут кэшироваться потоком локально.