zoukankan      html  css  js  c++  java
  • java 协调同步的线程

    Example12_8.java

    public class Example12_8 {
       public static void main(String args[ ]) {
          TicketHouse officer = new TicketHouse();
          Thread zhangfei,likui;
          zhangfei = new Thread(officer); 
          zhangfei.setName("张飞");
          likui = new Thread(officer);  
          likui.setName("李逵");
          zhangfei.start();
          likui.start();
       }
    }

    TicketHouse.java

    public class TicketHouse implements Runnable {
       int fiveAmount=2,tenAmount=0,twentyAmount=0; 
       public void run() {
          if(Thread.currentThread().getName().equals("张飞")) {
              saleTicket(20);
          }
          else if(Thread.currentThread().getName().equals("李逵")) {
              saleTicket(5);
          }
       }
       private synchronized void saleTicket(int money) {
           if(money==5) {  //如果使用该方法的线程传递的参数是5,就不用等待
            fiveAmount=fiveAmount+1; 
            System.out.println( "给"+Thread.currentThread().getName()+"入场卷,"+
                                Thread.currentThread().getName()+"的钱正好");
           }
           else if(money==20) {           
             while(fiveAmount<3) {
                try { System.out.println("
    "+Thread.currentThread().getName()+"靠边等...");
                      wait();       //如果使用该方法的线程传递的参数是20须等待
                      System.out.println("
    "+Thread.currentThread().getName()+"继续买票");
                }
                catch(InterruptedException e){}
             }
             fiveAmount=fiveAmount-3;
             twentyAmount=twentyAmount+1;
             System.out.println("给"+Thread.currentThread().getName()+"入场卷,"+
                                Thread.currentThread().getName()+"给20,找赎15元");
           }
           notifyAll();
       } 
    }

    Bank.java

    public class Bank implements Runnable {
       int money=200;
       public void setMoney(int n) {
          money=n;
       }
       public void run() {
          if(Thread.currentThread().getName().equals("会计")) 
             saveOrTake(300);
          else if(Thread.currentThread().getName().equals("出纳"))
             saveOrTake(150);;
       }
        public synchronized void saveOrTake(int amount) { //存取方法
          if(Thread.currentThread().getName().equals("会计")) {
             for(int i=1;i<=3;i++) { 
                 money=money+amount/3;      //每存入amount/3,稍歇一下
                 System.out.println(Thread.currentThread().getName()+
                                   "存入"+amount/3+",帐上有"+money+"万,休息一会再存");
                 try { Thread.sleep(1000);  //这时出纳仍不能使用saveOrTake方法 
                 }                       
                 catch(InterruptedException e){}
             }
          }
          else if(Thread.currentThread().getName().equals("出纳")) {
             for(int i=1;i<=3;i++) { //出纳使用存取方法取出60
                 money=money-amount/3;   //每取出amount/3,稍歇一下
                 System.out.println(Thread.currentThread().getName()+
                                   "取出"+amount/3+"帐上有"+money+"万,休息一会再取");
                 try { Thread.sleep(1000);       //这时会计仍不能使用saveOrTake方法
                 }                         
                 catch(InterruptedException e){}
             }
          }
       }
    }
  • 相关阅读:
    nodejs+mongoose操作mongodb副本集实例
    创建mongodb副本集操作实例
    SpringBoot(二)Web整合开发
    SpringBoot(一)走进Springboot的世界
    Git(二)Git几个区的关系与Git和GitHub的关联
    Git(一)之基本操作详解
    HttpClient(二)HttpClient使用Ip代理与处理连接超时
    HttpClient(一)HttpClient抓取网页基本信息
    Jsoup(一)Jsoup详解(官方)
    MongoDB(一)环境搭建与初始配置
  • 原文地址:https://www.cnblogs.com/yihujiu/p/5991181.html
Copyright © 2011-2022 走看看