黑马程序员技术交流社区
标题: 多线程操作同一对象属性 [打印本页]
作者: 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 |