Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
224 views
in Technique[技术] by (71.8m points)

为什么bank对象的状态没有被改变?

public class ThreadBySync {
    
            public static void main(String[] args) {
            
                Bank bank = new Bank("n1",100);
                Person p = new Person(bank);
                new Thread(p).start();
            
                System.out.println(bank);
                
            }
            
            
}


class Person implements Runnable{
    private Bank bank;
    
    public Person(Bank bank) {
        this.bank = bank;
    }
    
    public void run() {
        this.bank.withDraw(100);
    }
    
    
    
}

class Bank{
    
    private String name;
    private BigDecimal money;
    
    public Bank(String name,int money) {
        this.name = name;
        this.money = new BigDecimal(money);
    }
    
    public void deposit(int i) {
        BigDecimal tmp = new BigDecimal(i);
        this.money.add(tmp);
    }
    
    public void withDraw(int i ) {
        BigDecimal tmp = new BigDecimal(i);
        if(this.money.compareTo(tmp) >= 0) {
            this.money = this.money.add(new BigDecimal(-i));
        }
        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Bank [name=" + name + ", money=" + money + "]";
    }
    
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

new Thread(p).start()这句话表示开启一个线程,你在这个线程里对Bank对象进行修改。
但是在你修改前,你的System.out.println(bank)语句已经执行了,所以你输出的是未修改的Bank数据

你有两种改法:
第一种是使用join等待线程执行完毕

Thread thread = new Thread(p);
thread.start();
thread.join();

System.out.println(bank);

第二种是简单粗暴的使用sleep等待

new Thread(p).start();
//等待两秒
Thread.sleep(2000);
System.out.println(bank);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...