黑马程序员技术交流社区

标题: 多线程操作同一对象属性 [打印本页]

作者: yu244934256    时间: 2016-9-22 00:26
标题: 多线程操作同一对象属性
创建一个Bank银行类,属性有money(初始值为100),生成set/get方法,创建一个Bank银行对象,创建三个线程(分别给线程命名为"用户A","用户B","用户C")
        *当用户A线程执行时,通过set方法将money的值增加100,在控制台输出 "用户A线程正在执行第X,增加了100,目前money的值为X"
        *当用户B线程执行时,通过set方法将money值随机增加1-100(不含100),在控制台输出"用户B线程正在执行第X,增加了X,目前money的值为X"
        *当用户C线程执行时,线程休眠10毫秒,不作任何操作.在控制台输出"用户C线程正在执行第X,睡眠了10毫秒"
        *共执行20,最后打印输出money的值,"增加后的money值为:X"


作者: yu244934256    时间: 2016-9-22 23:31
[AppleScript] 纯文本查看 复制代码
        public static void main(String[] args) {
                StoreMoney t = new StoreMoney();
                new Thread(t, "用户A").start();
                new Thread(t, "用户B").start();
                new Thread(t, "用户C").start();
        }
}

class Bank {
       
        private int money;
       
        public Bank(){
                this.money=100;
        }
       

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

        public int getMoney() {
                return money;
        }
}

class StoreMoney extends Bank implements Runnable {
        boolean flag = false;
        private int i = 0;
       
        @Override
        public void run() {
                while (true) {
                        try {
                                Thread.sleep(10);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        synchronized (this) {
                                if (i < 20) {
                                        i++;
                                        if (Thread.currentThread().getName().equals("用户A")) {
                                                super.setMoney(100);
                                                System.out.println(Thread.currentThread().getName()
                                                                + "线程正在执行第" + i + "次,增加了100元,目前money的值为"
                                                                + super.getMoney() + "元");
                                        } else if (Thread.currentThread().getName().equals("用户B")) {
                                                int temp = (int) (Math.random() * 100 + 1);
                                                super.setMoney(temp);
                                                System.out.println(Thread.currentThread().getName()
                                                                + "线程正在执行第" + i + "次,增加了" + temp
                                                                + "元,目前money的值为" + super.getMoney() + "元");
                                        } else if (Thread.currentThread().getName().equals("用户C")) {
                                                try {
                                                        Thread.sleep(10);
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }
                                                System.out.println(Thread.currentThread().getName()
                                                                + "线程正在执行第" + i + "次,睡眠了10毫秒");
                                        }

                                        if (i == 20) {
                                                flag = true;
                                        }

                                } else {
                                        if (flag)
                                                System.out.println("增加后的money值为:" + super.getMoney());
                                        flag = false;
                                        break;
                                }
                        }
                }
        }


作者: 新奇士宝贝    时间: 2016-11-13 16:15
怎么目前money的值没有累加起来呢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2