zoukankan      html  css  js  c++  java
  • java多线程下模拟抢票

    我们设置三个对象分别同时抢20张票,利用多线程实现.

     1 public class Web123506 implements Runnable{
     2   private int ticteksNums=20;//票数
     3 
     4     @Override
     5     public void run() {
     6      while (true){
     7          if(ticteksNums<0){
     8              break;
     9          }
    10         /* try {
    11              //睡眠
    12              Thread.sleep(200);
    13          } catch (InterruptedException e) {
    14              e.printStackTrace();
    15          }*/
    16          System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--);
    17 
    18      }
    19     }
    20 
    21     public static void main(String[] args) {
    22            // 一份资源
    23         Web123506 web = new Web123506();
    24         //多个代理
    25         new Thread(web,"我们").start();
    26         new Thread(web,"你们").start();
    27         new Thread(web,"黄牛党").start();
    28 
    29     }
    30 
    31 }

    运行结果为:

    我们-->抢到了20
    黄牛党-->抢到了18
    你们-->抢到了19
    黄牛党-->抢到了16
    我们-->抢到了17
    黄牛党-->抢到了14
    你们-->抢到了15
    黄牛党-->抢到了12
    我们-->抢到了13
    黄牛党-->抢到了10
    你们-->抢到了11
    黄牛党-->抢到了8
    我们-->抢到了9
    黄牛党-->抢到了6
    你们-->抢到了7
    黄牛党-->抢到了4
    我们-->抢到了5
    黄牛党-->抢到了2
    你们-->抢到了3
    黄牛党-->抢到了0
    我们-->抢到了1

    结论:

    我们可以看到抢到的票没有重复的,说明线程是安全的.

    这时候我们加入线程的睡眠.观察线程此时是不是安全的?

     1 public class Web123506 implements Runnable{
     2   private int ticteksNums=20;//票数
     3 
     4     @Override
     5     public void run() {
     6      while (true){
     7          if(ticteksNums<0){
     8              break;
     9          }
    10          try {
    11              //睡眠
    12              Thread.sleep(200);
    13          } catch (InterruptedException e) {
    14              e.printStackTrace();
    15          }
    16          System.out.println(Thread.currentThread().getName()+"-->抢到了"+ticteksNums--);
    17 
    18      }
    19     }
    20 
    21     public static void main(String[] args) {
    22            // 一份资源
    23         Web123506 web = new Web123506();
    24         //多个代理
    25         new Thread(web,"我们").start();
    26         new Thread(web,"你们").start();
    27         new Thread(web,"黄牛党").start();
    28 
    29     }
    30 
    31 }

    运行结果:

    黄牛党-->抢到了20
    我们-->抢到了19
    你们-->抢到了18
    黄牛党-->抢到了17
    我们-->抢到了16
    你们-->抢到了15
    黄牛党-->抢到了14
    我们-->抢到了13
    你们-->抢到了12
    你们-->抢到了11
    我们-->抢到了10
    黄牛党-->抢到了9
    你们-->抢到了8
    我们-->抢到了7
    黄牛党-->抢到了6
    你们-->抢到了5
    我们-->抢到了4
    黄牛党-->抢到了3
    你们-->抢到了2
    我们-->抢到了1
    黄牛党-->抢到了0
    你们-->抢到了-1
    我们-->抢到了-1

    结论:

    当我们加入线程的睡眠,此时抢到的票可能出现了负数或者会出现两个人抢到了同一张票此时说明加入线程睡眠线程是不安全的.

  • 相关阅读:
    解决Maven下载依赖慢
    Spring Boot系列教程六:日志输出配置log4j2
    Spring Boot系列教程三:使用devtools实现热部署
    Spring Boot系列教程五:使用properties配置文件实现多环境配置
    Spring Boot系列教程四:配置文件详解properties
    Spring Boot系列教程二:创建第一个web工程 hello world
    Spring Boot系列教程一:Eclipse安装spring-tool-suite插件
    Spring Boot系列教程十:Spring boot集成MyBatis
    vim入门一 常用指令
    Linux IO多路复用之epoll网络编程(含源码)
  • 原文地址:https://www.cnblogs.com/xiaoqiqistudy/p/10984265.html
Copyright © 2011-2022 走看看