6.18Java多线程同步方法实现DemoNo2

6.18Java多线程同步方法实现DemoNo2

使用同步方法重写购票demo

package iostudy.synchro;

/**
* 模拟买火车票
*/
public class Happy12306 {
   public static void main(String[] args) {

       /*实例化资源类*/
       Web12306 web12306 = new Web12306(4, "Happy!");

       /*实例化代理对象*/
       new Passenger(2, web12306, "Jun").start();
       new Passenger(1, web12306, "Harden").start();

  }
}

/**
* 创建乘客资源类
*/
class Passenger extends Thread{

   /*设置资源*/
   int seats;

   public Passenger(int seats, Runnable target, String name){
       super(target, name);
       this.seats = seats;
  }
}

/**
* 另一个资源类
*/
class Web12306 implements Runnable{

   /*设置资源*/
   int available;
   String name;

   /*构造器*/
   public Web12306(int available, String name){
       this.available = available;
       this.name = name;
  }

   /**
    * 重写run方法,思考如何获得参数
    */
   public void run(){
       /*通过强制转型的方法拿到seats的值*/
       Passenger p = (Passenger) Thread.currentThread();
       boolean flag = this.bookTickets(p.seats);
       if (flag){
           System.out.println("出票成功!" + Thread.currentThread().getName()
           + "位置为" + p.seats);
      }else {
           System.out.println("出票失败" + Thread.currentThread().getName()
           + "位置不够!!");
      }
  }

   /**
    * 购买方法
    */
   public synchronized boolean bookTickets(int seats){
       System.out.println("可用位置为:" + available);
       if (seats>available){
           return false;
      }

       available -= seats;
       return true;

  }
}
梳理
  • 需要使用同步方法保证数据安全

  • 怎么与乘客交互?

    • 乘客继承Thread类

      • 好处:可以在子类当中+线程变量

    • 延续父类的构造器,进行类型强制转型

  • 拿到结果

posted @ 2021-06-18 19:33  俊king  阅读(199)  评论(0)    收藏  举报