1. package try51.thread.safe;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Random;
  5. import java.util.concurrent.ExecutorService;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.locks.Lock;
  8. import java.util.concurrent.locks.ReentrantLock;
  9.  
  10. public class LockDemo {
  11. public static void main(String[] args) {
  12. // 所有票源
  13. ArrayList<Thread> lst = new ArrayList<>();
  14. lst.add(new Thread(new Tickets2("网上 售票")));
  15. lst.add(new Thread(new Tickets2("手机APP 售票")));
  16. lst.add(new Thread(new Tickets2("实地窗口售票")));
  17.  
  18. // 随机产生一个客户端类型
  19. Random rdom = new Random();
  20. // 设置一个线程池
  21. ExecutorService es = Executors.newFixedThreadPool(100);
  22. // 模拟有 15个客户端 来购票
  23. for (int i = 0; i < 15; i++) {
  24. int index = rdom.nextInt(3);
  25. Thread thread = lst.get(index);
  26. // 购票线程进入线程池
  27. es.submit(thread);
  28. }
  29. // 关闭线程池
  30. es.shutdown();
  31. }
  32. }
  33.  
  34. /**
  35. *
  36. * @author lztkdr
  37. *
  38. */
  39. class Tickets2 implements Runnable {
  40.  
  41. // 安全锁对象
  42. public static Lock locker = new ReentrantLock();
  43.  
  44. // 静态的票总数(固定)
  45. public static int TicketCount = 10;
  46.  
  47. public String name;
  48.  
  49. /**
  50. *
  51. * @param name
  52. * 客户端 票源
  53. */
  54. public Tickets2(String name) {
  55. this.name = name;
  56. }
  57.  
  58. @Override
  59. public void run() {
  60. // 线程锁 队列式 售票
  61. locker.lock();
  62. try {
  63. // 模拟购票需要200毫秒
  64. Thread.sleep(200);
  65. if (TicketCount > 0) {
  66. System.out.println(this.name + "\t出售1一张,剩余\t " + (--TicketCount));
  67. } else {
  68. System.out.println(this.name + "\t沒有抢到票!!!");
  69. }
  70.  
  71. } catch (InterruptedException e) {
  72. e.printStackTrace();
  73. } finally {
  74. locker.unlock();
  75. }
  76. }
  77. }

模拟线程安全的售票案例(java)的更多相关文章

  1. java多线程(三)之售票案例

    售票案例: 火车站3个窗口售100张票. 1.自定义类SellTicket.java package com.test.com.pers.thread; /** * Created by yadong ...

  2. 2018.3.3 多线程中继承Thread 和实现Runnable接口 的比较(通过售票案例来分析)

    多线程中继承Thread 和实现Runnable接口 的比较(通过售票案例来分析) 通过Thread来实现 Test.java package com.lanqiao.demo4; public cl ...

  3. 关于CPU核心,线程,进程,并发,并行,及java线程之间的关系

    前言:作为一个转行java的小白,一直搞不清楚java中的多线程.于是来梳理一下关于CPU核心,线程,进程,并发,并行,及java线程之间的关系, 1.CPU角度来看: 我们以Intel的Core i ...

  4. [译]线程生命周期-理解Java中的线程状态

    线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...

  5. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  6. Java基础知识强化之IO流笔记53:IO流练习之 自定义类模拟BufferedReader的readLine()功能案例

    1. 用Reader模拟BufferedReader的readLine()功能:   readLine():一次读取一行,根据换行符判断是否结束,只返回内容,不返回换行符 2. 代码实现和思路分析: ...

  7. 使用ThreadGroup模拟线程池

    参考文章: [1]创建线程池 http://sunnylocus.iteye.com/blog/223327?page=2#comments [2]线程组ThreadGroup  http://hub ...

  8. wait/notify模拟线程池

    线程创建和销毁会消耗很多的资源,当我们创建线程时,会发现cpu利用率很高,为了节省资源的使用,使用线程池是一个比较好的选择,当有任务需要执行时,随机分配给一条线程去执行,也可以删除任务,获取任务数量等 ...

  9. 详解线程池的作用及Java中如何使用线程池

    服务端应用程序(如数据库和 Web 服务器)需要处理来自客户端的高并发.耗时较短的请求任务,所以频繁的创建处理这些请求的所需要的线程就是一个非常消耗资源的操作.常规的方法是针对一个新的请求创建一个新线 ...

随机推荐

  1. 关于HTML标签嵌套的问题详解

    先说基础,HTML标签有两类: 1.块级元素 div.h1~h6.address.blockquote.center.dir.dl.dt.dd.fieldset.form.hr.isindex.men ...

  2. 网站性能测试指标(QPS,TPS,吞吐量,响应时间)详解

    转载:http://www.51testing.com/html/16/n-3723016.html   常用的网站性能测试指标有:吞吐量.并发数.响应时间.性能计数器等. 并发数 并发数是指系统同时 ...

  3. SQLServer------远程调用失败

    1.情况 出现 2.解决方法 打开“控制面板” -> “卸载程序” -> 找到 “Microsoft SQL Server 2016) ExpressLocalDB”将其卸载 -> ...

  4. Eclipse Maven 配置setting.xml 的镜像远程仓库

    1.在.m2中新建settings.xml文件 1.window-->Preferences-->Maven-->User Settings 3.点击open file 编辑将远程仓 ...

  5. iOS开发--UIButton 设置圆角 边框颜色 点击回调方法

    UIButton *signBtn = [UIButton buttonWithType:UIButtonTypeCustom]; signBtn.frame = CGRectMake(, , , ) ...

  6. Nginx(五)-- 配置文件之Rewrite

    Rewrite支持URL重写 1.常用指令以及语法 1) if指令    if语法: if 空格 (condition) {}     条件:     1. “=” 来判断相等,用于字符的比较     ...

  7. adb(android debug bridge)命令

    adb(android debug bridge) adb devices --查看当前连接的模拟器/设备 adb remount --模拟器/设备重新启动,保证能用 adb push src des ...

  8. Swift - 构造函数

    Swift 2.0 构造函数基础 构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,为对象成员变量设置初始值,在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重 ...

  9. 脚本学习 game.sh

    #!/bin/bash #game_error.sh ]]; then #$#表示参数个数 -lt小于 echo "Usage: game_error.sh time[20170710]&q ...

  10. Android中Handler引起的内存泄露

    在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用.通常我们的代码会这样实现. 1 2 3 4 5 6 7 8 9 public class SampleActivit ...