Java多线程——线程同步(1)

为什么又写了线程同步(2)呢,因为感觉编程这个事情真的是很神奇呀,同样一个需求,由不同的人去分析,去编写会产生完全 不同的代码,还是上次那题,今天这篇写一些老师讲解的思路和内容
其实个人认为条条大路通罗马,能解决问题都是好办法,但是本人目前处于学习阶段,能解决问题固然是好的,但是我觉得更重要的是培养一个好的解题思路或者讲说是符合业内编程规范的代码写法,虽然说每个人的脑回路是不同的,但是代码毕竟不是给自己一个人看的。
—— 以上为个人拙见,如有不对还望指正~~

再放一下上次的题目:
利用多线程实现男孩存钱,女孩取钱的功能:

1,有一个银行账户Account类,此类中有余额属性private int balance;并且可以进行存、取钱功能

2,有Boy和Girl类都实现了Runnable接口,这两个类在主体方法中可以操作Account类中的存取钱方法

3,测试类进行检验男孩存钱,女孩取钱

提示:1,男孩女孩肯定是操作同一个银行账户,

2,可以使用Math.Random()方法完成存取钱的数目

3,同时,女孩取钱太多时,应该不成功,需要等到男孩再存钱,之后再取

这次直接放上老师讲解的代码,思路分析我写到注释里了

public class AAAA {
    //main方法主要写对于其他方法的调用以及创建写好的各个类
    public static void main(String[] args) {
        //账户类对象account,新开户需要账户中有钱,这里假定为100
        Account account = new Account(1000);
        //Boy类对象boy,将账户交到boy手中
        Boy boy = new Boy(account);
        //Girl类对象girl,将同一个账户交到girl手中
        Girl girl = new Girl(account);
        //因为Boy和Girl类都实现的是Runnable接口,所以需要包装为线程类,同时为了好区分,设置线程名
        Thread t1 = new Thread(boy, "男孩");
        Thread t2 = new Thread(girl, "女孩");
        //启动两个线程
        t1.start();
        t2.start();
    }
}
//账户类
class Account{
    //只有一个私有变量,账户余额
    private int balance;
    //无参构造器
    public Account() {}
    //单参构造器,设置账户余额
    public Account(int balance) {
        this.balance = balance;
    }
    //存钱方法,使用synchronized关键字将该段代码锁起来,写在普通方法前锁对象为this
    public synchronized void cunqian(int num){
        //传入存钱数目,并增加数目到余额
        balance+=num;
        //输出相关信息
        System.out.println("男孩存了:"+num+"银行卡中总共还有:"+balance+"元");
        //因为下面女孩取钱时余额不足时会wait()所以男孩存完钱使用notify()唤醒女孩
        notify();
    }
    
    //和上面一样,使用synchronized使两个线程在此时同步执行
    public synchronized void quqian(int num){
        //与存钱方法不同,取钱时要先判断余额是否充足
        if (num>balance) {
            //余额不足时输出信息并且使调用该方法的线程进入wait()状态
            System.out.println("女孩取了"+num+"元钱,太多了,余额:"+balance+"不足,需要等待男孩存钱");
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }else {
            //如果余额充足,则直接减去要取出的金额
            balance-=num;
            //这里使用.err输出只是为了使控制台显示的时候好辨别男孩和女孩的行为
            System.err.println("女孩取了"+num+"元钱,余额:"+balance);
        }
    }
    
}
//Boy类实现Runnable接口
class Boy implements Runnable{

    Account account;
    
    //单参构造函数,要求传入一个账户
    public Boy(Account account) {
        super();
        this.account = account;
    }


    public Boy() {}


    @Override
    public void run() {
        while (true) {
            int aaa = (int) (Math.random() * 1000);
            account.cunqian(aaa);
            try {
                Thread.sleep(aaa*5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
}
//Girl类实现Runnable接口
class Girl implements Runnable{
    Account account;

    public Girl() {}
    //单参构造函数,要求传入一个账户
    public Girl(Account account) {
        this.account = account;
    }

    @Override
    public void run() {
        while (true) {
            
            int aaa = (int) (Math.random() * 1000);
            //使用Account类中的取钱方法
            account.quqian(aaa);
            try {
                Thread.sleep(aaa);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
}

运行结果:


这里写图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339

推荐阅读更多精彩内容