zoukankan      html  css  js  c++  java
  • 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();
      }
    }

     

    It's a lonely road!!!
  • 相关阅读:
    protobuf使用遇到的坑
    嵌入式开发入门心得记录
    vim编辑模式下黑色背景,下来过程中出现白条的问题
    linux中awk的应用
    ntp时间同步
    mysql5.5适配
    centos 安装 epel
    ubuntu jdk安装
    add_header Access-Control-Allow-Origin $http_Origin always;
    111
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14838849.html
Copyright © 2011-2022 走看看