6.1Java多线程抢票龟兔赛跑

6.1Java多线程抢票龟兔赛跑

多线程抢票,并发问题,数据安全异常

package iostudy.thread;

/**
* 共享资源
* 一份资源,三个代理商
* 当一份资源有多个代理去操作的时候就会存在并发问题
* 并发发生之后后期需要保证线程安全
* @since JDK 1.8
* @date 2021/6/1
* @author Lucifer
*/
public class Web12306 implements Runnable{

   /*资源数量*/
   private int ticketNum = 99;

   /*重写run方法*/
   @Override
   public void run(){
       /*死循环拿资源*/
       while (true){
           /*判断*/
           if (ticketNum < 0){
               /*循环终止*/
               break;
          }
           /*模拟网络延迟*/
           //因为run方法不能对外抛出异常且无返回值,所以使用try...catch捕获异常
           try {
               Thread.sleep(200);
          }catch (InterruptedException e){
               e.printStackTrace();
          }
           System.out.println(Thread.currentThread().getName() + "--->" +ticketNum--); //在输出层面关注是哪一个代理人获取到的资源--->使用Thread类里面的方法
           /*
           同一线程体有多个线程的时候做区分的
           这样操作就是并发了,会出现数据的不安全
            */
      }
  }

   public static void main(String[] args) {

       /*一份资源*/
       Web12306 web = new Web12306();

       /*打印main方法*/
       System.out.println(Thread.currentThread().getName());

       //三个代理人
       new Thread(web, "南博万").start(); //在构造器给标识,区分是哪一个代理人拿到的资源
       new Thread(web, "南博兔").start();
       new Thread(web, "南博斯瑞").start();
  }
}

这个写法会存在一个问题--->数据安全问题

多线程模拟比赛

package iostudy.thread;

/**
* 模拟龟兔赛跑
* 1、实现类写具体的实现方法--->循环、判断
* 2、具体方法工具类写判断方法--->供线程调用
* @since JDK 1.8
* @date 2021/6/1
* @author Lucifer
*/
public class Racer implements Runnable{
   /*
   1、这是具体的实现类,里面定义了具体的属性
   2、重写了Runnable里面的run方法,该方法定义了具体的实现方式
   3、判断方法新写一个方法去调用
   */
   private static String winner; //定义胜利者
   @Override
   public void run(){
       for (int steps = 0; steps <= 100; steps++){
           /*模拟兔子休息*/
           if (Thread.currentThread().getName().equals("rabbit") && steps%25==0){
               /*每走25步休息一次*/
               try {
                   /*线程休眠--->静态方法*/
                   Thread.sleep(100);
              }catch (InterruptedException e){
                   e.printStackTrace();
              }
          }
           /*输出是谁达到了一百步*/
           System.out.println(Thread.currentThread().getName() + "--->" + steps);
           /*每运行一次判断比赛是否结束*/
           boolean flag = gameOver(steps);
           /*如果flag的值是真*/
           if (flag == true){
               /*停止循环*/
               break;
          }
      }
  }

   /**
    * 胜利条件判断的方法
    * @param steps     步数
    * @return
    */
   public boolean gameOver(int steps){
       if (winner!=null){
           /*存在胜利者,返回真*/
           return true;
      }else {
           /*先到达一百步的人*/
           if (steps == 100){
               /*获得胜利者的名字*/
               winner = Thread.currentThread().getName();
               /*输出*/
               System.out.println("Winner is:" + winner);
               /*返回真*/
               return true;
          }
      }
       return false;
  }

   public static void main(String[] args) {
       /*一份资源,两个代理人*/
       Racer racer = new Racer();
       /*两个代理人,共享资源*/
       new Thread(racer, "tortoise").start();
       new Thread(racer, "rabbit").start();
  }
}

 

posted @ 2021-06-01 20:55  俊king  阅读(256)  评论(0编辑  收藏  举报