В главном потоке создаётся объект, в данном случае типа Integer. После этого создаётся побочный поток, который этот объект как-то меняет, на этом его работа заканчивается. И продолжается работа main, где просто выводим значение этого изменённого(как мы этого ожидаем) объекта. Но в результате вмето 10 получаем всё тот же 0, будто бы никаких изменений в побочном потоке и не было.
Но вот если этот Integer упаковать ещё во что-то, всё будет ок, и получим на выходе 10.
Подскажите, что я упускаю при работе с Integer?
public class Runner {
static class ChangeInteger extends Thread{
Integer i;
public void run(){
while(i < 10){
System.out.println(i);
increment();
}
}
void setInteger(Integer value){
i = value;
}
private void increment(){
i++;
}
}
public static void main(String[] args) {
ChangeInteger CI = new ChangeInteger();
Integer mainInt = 0;
CI.setInteger(mainInt);
CI.start();
try {
CI.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(mainInt);
}
}
Integer иммутабелен. Если вы хотите передать его по ссылке с возможностью изменения, то пишите свой врапер и передавайте его.
public class MyWrapInt{
public int value;
}
Или используйте что-нибудь готовое, тот же AtomicInteger. У него есть метод set для изменения значения.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей