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){}
             }
          }
       }
    }
  • 相关阅读:
    jQuery文件上传插件Uploadify(转)
    最简单易懂的SpringCloudSleuth教程
    微信协议简单调研笔记
    Base64 image
    javascript身份证号码验证
    基于微信的产品设计01:注册登录及账号体系设计
    android端 socket长连接 架构
    win7管理工具不可用
    http和socket之长连接和短连接区别
    Socket 长连接与短连接,心跳
  • 原文地址:https://www.cnblogs.com/yihujiu/p/5991181.html
Copyright © 2011-2022 走看看