package Thread;

import javax.xml.bind.ValidationEvent;

class snacks{
    private int  SaledSnacks=0;
    private int  TotalSnacksNum=10; //初始化小吃店开始有10个面包
    private int  TOTALtimeOFSALE=0;
    public synchronized boolean salesnacks() {
        if (TotalSnacksNum>0) {
            SaledSnacks++;
            TotalSnacksNum--;
            TOTALtimeOFSALE++;
            System.out.println(Thread.currentThread().getName()+"卖出一个面包");
            return true;
        }else {
            System.out.println("目前已经卖完了,需要等会儿才有");
            return false;
        }
    }
    public synchronized boolean makesnacks() {
            TotalSnacksNum++;
            TOTALtimeOFSALE+=3;
            System.out.println(Thread.currentThread().getName()+"做出一个面包");
            return true;
    }
}
class SaleSnacks extends Thread{
    private snacks Snacks=new snacks();
    public SaleSnacks(String name,snacks s) {
        super(name);
        Snacks=s;
    }

    public void Validation() {
        while(Snacks.salesnacks()) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }    
        }
            if (!Snacks.salesnacks()) {
                try {
                    Thread.sleep(5000);
                    while(Snacks.salesnacks()) {
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                        }    
                    }
                    
                } catch (Exception e) {
                    // TODO: handle exception
                }
                
            }
        Validation();
    }
    @Override
    public void run() {
        Validation();
    }
}
class MakeSnacks extends Thread{
    private snacks Snacks=new snacks();
    public MakeSnacks(String name,snacks s) {
        super(name);
        Snacks=s;
    }
    @Override
    public void run() {
        while(Snacks.makesnacks()) {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
            
        }
    }
}

public class Thread_synchronized {
    public static void main(String[] args) throws InterruptedException {
     System.out.println("开始卖 snack!!!");
         snacks AIMSnackShop=new snacks();
         SaleSnacks sale1=new SaleSnacks("windows:A", AIMSnackShop);
         SaleSnacks sale2=new SaleSnacks("windows:B", AIMSnackShop);
         SaleSnacks sale3=new SaleSnacks("windows:C", AIMSnackShop);
         MakeSnacks makeSnacks =new MakeSnacks("Make: A", AIMSnackShop);
         sale1.start();
         sale2.start();
         sale3.start();
         makeSnacks.start();
         try {
            Thread.sleep(500000);
        } catch (IllegalThreadStateException e) {
            e.printStackTrace();
        }
    }
}

java线程学习第一天__低配版的卖面包机的更多相关文章

  1. 【Java】利用注解和反射实现一个"低配版"的依赖注入

    在Spring中,我们可以通过 @Autowired注解的方式为一个方法中注入参数,那么这种方法背后到底发生了什么呢,这篇文章将讲述如何用Java的注解和反射实现一个“低配版”的依赖注入. 下面是我们 ...

  2. Jenkins 结合 Docker 为 .NET Core 项目实现低配版的 CI&CD

    随着项目的不断增多,最开始单体项目手动执行 docker build 命令,手动发布项目就不再适用了.一两个项目可能还吃得消,10 多个项目每天让你构建一次还是够呛.即便你的项目少,每次花费在发布上面 ...

  3. 【Node/JavaScript】论一个低配版Web实时通信库是如何实现的( WebSocket篇)

    引论 simple-socket是我写的一个"低配版"的Web实时通信工具(相对于Socket.io),在参考了相关源码和资料的基础上,实现了前后端实时互通的基本功能 选用了Web ...

  4. 基于canvas和web audio实现低配版MikuTap

    导言 最近发掘了一个特别happy的网页小游戏--MikuTap.打开之后沉迷了一下午,导致开发工作没做完差点就要删库跑路了,还好boss瞥了我一眼就没下文了.于是第二天我就继续沉迷,随着一阵抽搐,这 ...

  5. 【JavaScript】论一个低配版Web实时通信库是如何实现的之二( EventSource篇)

    前情提要 「 话说上回说到!那WebSocket大侠,巧借http之内力,破了敌阵的双工鸳鸯锁,终于突出重围. 然而玄难未了,此时web森林中飞出一只银头红缨枪,划破夜色. "莫非!?&qu ...

  6. 搭建react项目(低配版)

    react项目低配版,可作为react相关测试的基础环境,方便快速进行测试. git clone git@github.com:whosMeya/simple-react-app.git git ch ...

  7. java 线程学习

    转载:详见处http://lavasoft.blog.51cto.com/62575/27069   Java多线程编程总结   下面是Java线程系列博文的一个编目:   Java线程:概念与原理 ...

  8. Java线程学习详解

    线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1 ...

  9. java线程学习——汉堡销售问题

    汉堡店中有一个负责做汉堡的厨师,一个负责销售的营业员,用java线程表示他们的营业过程: 问题原型就是生产者与消费者的问题. 首先定义一个汉堡包箱子类与几个相关的变量类: public class H ...

随机推荐

  1. Scrapy-多层爬取天堂图片网

    1.根据图片分类对爬取的图片进行分类 开发者选项 --> 找到分类地址         爬取每个分类的地址通过回调函数传入下一层 name = 'sky'start_urls = ['http: ...

  2. Yii2数据库操作再总结

    User::find()->all(); 此方法返回所有数据:User::findOne($id); 此方法返回 主键 id=1 的一条数据(举个例子): User::find()->wh ...

  3. git命令 高级

    Git 分支 - 分支的删除 git删除本地分支 git branch -D br git删除远程分支 git push origin :br  (origin 后面有空格) clone服务器上的资源 ...

  4. 基于Python的Flask的开发实战(第二节程序的基本结构)

    1.初始化 所有的flask程序都必须创建一个程序实例 web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理.这个程序实例就是flask对象 from flask imp ...

  5. Hadoop序列化与Java序列化

    序列化就是把内存中的对象的状态信息转换成字节序列,以便于存储(持久化)和网络传输 反序列化就是就将收到的字节序列或者是硬盘的持久化数据,转换成内存中的对象. 1.JDK的序列化 只要实现了serial ...

  6. 我的Java设计模式-观察者模式

    相信大家都有看过<喜洋洋与灰太狼>,说的是灰太狼和羊族的"斗争",而每次的结果都是灰太狼一飞冲天,伴随着一句"我还会回来的......".为灰太狼感 ...

  7. python函数式编程之装饰器(二)

    以前用装饰器,都是定义好了装饰器后,使用@装饰器名的方法写入被装饰函数的正上方 在这里,定义的装饰器都是没有参数的 在定义装饰器的函数的时候,没有在括号里定义参数,这就叫做无参装饰器 既然有无参装饰器 ...

  8. 经典案例之MouseJack

    引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...

  9. mysql字符串连接

    用SQL Server 连接字符串是用“+” 现在数据库用mysql, 写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作, ...

  10. HighCharts之2D含有负值的面积图

    HighCharts之2D含有负值的面积图 1.HighCharts之2D含有负值的面积图源码 AreaNegative.html: <!DOCTYPE html> <html> ...