黑马程序员技术交流社区

标题: 在锁对象了以后为什么我把计数器放在前面会无限循环 [打印本页]

作者: kangnam    时间: 2016-9-18 17:06
标题: 在锁对象了以后为什么我把计数器放在前面会无限循环
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;
        }
       
}
作者: kangnam    时间: 2016-9-18 19:25
巴拉拉能量,呼啦呼啦、全身变、快来人




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