• 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

    结论:

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

  • 相关阅读:
    java发送邮件
    MySQL查询表结构的SQL语句
    Jquery的toggle()方法
    jQuery为图片添加链接(创建新的元素来包裹选中的元素)
    mysql修改存储过程的权限
    php中接收参数,不论是来自GET还是POST方法
    解决php中文乱码
    MySQL的视图view,视图创建后,会随着表的改变而自动改变数据
    选项卡面向对象练习
    对数组的操作splice() 和slice() 用法和区别
  • 原文地址:https://www.cnblogs.com/xiaoqiqistudy/p/10984265.html
Copyright © 2020-2023  润新知