В главном потоке создаётся объект, в данном случае типа 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
для изменения значения.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
При изучении в java цикла for написала простой цикл, который должен выводить все четные числа до 100 и оставлять между ними строкуЯ нашла в итоге...
Перечитал много материала, задача о ранце не подходит, потому что значение нужно либо большее (с минимальной разницей), либо равное заданному...