package com.practice;
import java.util.Random;
/*创建一个Bank银行类,属性有money(初始值为100),生成set/get方法,创建一个Bank银行对象,创建三个线程(分别给线程命名为"用户A","用户B","用户C")(4分)
*当用户A线程执行时,通过set方法将money的值增加100,在控制台输出 "用户A线程正在执行第X次,增加了100元,目前money的值为X元" (2分)
*当用户B线程执行时,通过set方法将money值随机增加1-100(不含100),在控制台输出"用户B线程正在执行第X次,增加了X元,目前money的值为X元" (2分)
*当用户C线程执行时,线程休眠10毫秒,不作任何操作.在控制台输出"用户C线程正在执行第X次,睡眠了10毫秒"(2分)
*共执行20次,最后打印输出money的值,如 "增加后的money值为:X元"(2分)
*注意:(机子速度太快有可能会出现一条线程全执行完没关系,关键要实现需求)
* */
public class SynchronizedDemo2 {
public static void main(String[] args) throws Exception {
Bank bank =new Bank();
Thread a =new Thread(bank,"用户A");
Thread b =new Thread(bank,"用户B");
Thread c =new Thread(bank,"用户C");
a.start();
b.start();
c.start();
//等待这些进程先执行完,在输出总金额;不然输出错误(第一句就输出了)
a.join();
b.join();
c.join();
System.out.println("增加后的money为:"+bank.getNum()+"元");
}
}
class Bank implements Runnable{
private static int num = 100;
private static int count = 0;
@Override
public void run() {
while(true){
String name =Thread.currentThread().getName();
synchronized(this){
//count不能放这里,我觉得原因是因为线程进来就加,中间遇到失去执行权,但是count++,中间错过了20
if(count==20){ //可以把条件改成大于20
break;
}
++count;
//用户A线程正在执行第X次,增加了100元,目前money的值为X元
if(name.equals("用户A")){
new Bank().setNum(num+100);
System.out.println(name+"线程正在执行第"+count+"次,增加了100元,目前money的值为"+new Bank().getNum()+"元");
}else if(name.equals("用户B")){
//++count;
//用户B线程执行时,通过set方法将money值随机增加1-100(不含100),在控制台输出"用户B线程正在执行第X次,增加了X元,目前money的值为X元"
//int random = (new Random()).nextInt(99)+1;
int random =(int) ((Math.random()*99)+1);
//num+=random;
new Bank().setNum(num+random);
System.out.println(name+"线程正在执行第"+count+"次,增加了"+random+"元,目前money的值为"+new Bank().getNum()+"元");
}else if(name.equals("用户C")){
//++count;
//线程C休眠10毫秒,不作任何操作.在控制台输出"用户C线程正在执行第X次,睡眠了10毫秒"
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"线程正在执行第"+count+"次,睡眠了10毫秒");
}
}
}
}
public Bank() {
super();
}
public Bank(int num) {
super();
this.num = num;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
} |
|